Регулярное выражение для удаления части строки, если ей предшествует какое-либо слово в Java


Есть файл пакета языка свойств:

label.username=Username:
label.tooltip_html=Please enter your username.</center></html>
label.password=Password:
label.tooltip_html=Please enter your password.</center></html>

Как сопоставить все строки, которые имеют как "_html", так и "

"в этом порядке и заменить их той же строкой, кроме окончания"

5 2

5 ответов:

Поскольку вы уточнили, что это регулярное выражение должно использоваться в IDE, я протестировал его в Eclipse, и он работает:

FIND:
(_html.*)</center></html>

REPLACE WITH:
$1

Убедитесь, что вы включили переключатель регулярных выражений в диалоговом окне Поиск/замена. Это будет соответствовать любой строке, содержащей _html.* (где .* жадно соответствует любой строке, не содержащей новых строк), а затем </center></html>. Он использует (…) скобки для захвата что было сопоставлено с группой 1, и $1 в замена заменителей в какой группе 1 захвачена.

Это эффективно удаляет </center></html>, Если этой строке предшествует _html в этой строке.

Если в строке может быть несколько </center></html>, и все они должны быть удалены, если слева от них есть _html_, то регулярное выражение будет более сложным, но это можно сделать в одном регулярном выражении с помощью \G продолжение якоря если это абсолютно необходимо.


Вариации

Говоря более обобщенно, вы также можете сопоставьте такие вещи:

(delete)this part only(please)

Теперь это создает 2 группы захвата. Вы можете сопоставить строки с этим шаблоном и заменить на $1$2, и он будет эффективно удалять this part only, но только если ему предшествует delete и за ним следует please. Конечно, эти подшаблоны могут быть более сложными.

if (line.contains("_html=")) {
   line = line.replace("</center></html>", "");
}

Здесь не требуется регулярное выражение;) (edit ) до тех пор, пока все строки файла свойствхорошо сформированы .

String s = "label.tooltip_html=Please enter your password.</center></html>";
Pattern p = Pattern.compile("(_html.*)</center></html>");
Matcher m = p.matcher(s);
System.out.println(m.replaceAll("$1"));

Попробуйте что-нибудь вроде этого:

Pattern p = Pattern.compile(".*(_html).*</center></html>");
Matcher m = p.matcher(input_line); // get a matcher object
String output = input_line;
if (m.matches()) {
  String output = input_line.replace("</center></html>", "");   
}
/^(.*)<\/center><\/html>/ 

Находит вас

label.tooltip_html=Please enter your username. 

Часть. тогда вы можете просто правильно собрать строку.