Regex для удаления части строки, если ей предшествует какое-то слово в Java - PullRequest
2 голосов
/ 27 августа 2010

Существует файл языкового пакета свойств:

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" и "" в этом порядке, и заменить их на одну и ту же строку, кроме окончания "". Например, строка:

label.tooltip_html=Please enter your username.</center></html>

должно стать:

label.tooltip_html=Please enter your username.

Примечание. Я хотел бы выполнить эту замену с помощью IDE (IntelliJ IDEA, Eclipse, NetBeans ...)

Ответы [ 5 ]

4 голосов
/ 27 августа 2010

Поскольку вы пояснили, что это регулярное выражение должно использоваться в 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.Эти подшаблоны, конечно, могут быть более сложными.

3 голосов
/ 27 августа 2010
if (line.contains("_html=")) {
   line = line.replace("</center></html>", "");
}

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

1 голос
/ 27 августа 2010
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"));
1 голос
/ 27 августа 2010

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

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>", "");   
}
0 голосов
/ 27 августа 2010
/^(.*)<\/center><\/html>/ 

находит вас

label.tooltip_html=Please enter your username. 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...