Заменить строку внутри тегов?

Я хочу заменить содержимое внутри некоторых тегов, например:

<p>this it to be replaced</p>

Я мог бы извлечь контент между такими группами, но могу ли я заменить группу?

str = str.replaceAll("<p>([^<]*)</p>", "replacement");

Ответ 1

Измените регулярное выражение на это:

(?<=<p>).*?(?=</p>)

т.е.

str = str.replaceAll("(?<=<p>).*?(?=</p>)", "replacement");

Это использует "смотреть за" и "смотреть вперед", чтобы утверждать, но не захватывать, вводить до/после совпадающего (не жадного) регулярного выражения

На всякий случай кто-то задается вопросом, этот ответ отличается от dacwe's: он использует ненужные скобки. Этот ответ более изящный :)

Ответ 2

Вы можете использовать lookaround (положительный lookahead и lookbehind) для этого:

Измените регулярное выражение на: "(?<=<p>)(.*?)(?=</p>)" и все будет в порядке.


Пример:

String str = "<p>this it to be replaced</p>";
System.out.println(str.replaceAll("(?<=<p>)(.*?)(?=</p>)", "replacement"));

Вывод:

<p>replacement</p>

Обратите внимание, что если вы разбираете HTML, вы должны использовать какой-то HTML-парсер, часто регулярные выражения недостаточно хороши...