#java #regex #replace
#java #регулярное выражение #замените
Вопрос:
У меня есть эта строка с HTML внутри: <span title="whatever">something I want to preserve</span>...
Я использую регулярное выражение для замены <span title="whatever">
на (
, а затем следующее </span>
замените на )
Pattern regex = Pattern.compile("<span\s [^>]*title=(['"])(.*?)\1[^>]*>");
Matcher matcher = regex.matcher(strLine);
if (matcher.find()) {
strLine = matcher.replaceAll("(");
strLine = strLine.replace("</span>", ")");
}
I работает, но он заменяет все </span>
теги; Я только хочу заменить тот, который соответствует открывающему тегу, который я только что сопоставил.
Комментарии:
1. Вы пробовали
replace
вместоreplaceAll
?2. Итак, если я вас правильно понимаю, вам нужно заменить любой интервал заголовком с помощью (), но любой интервал, у которого нет заголовка, вы хотите оставить в покое. И проблема, с которой вы столкнулись выше, заключается в том, что открывающие теги
<span>
заменяются правильно, но заменяется слишком много закрывающих тегов</span>
(т. Е. те, которые соответствуют открывающим тегам без заголовка. Это правильно?
Ответ №1:
Почему бы не сделать это за один replaceAll(...)
вызов:
String s = "noise <span title="whatever">something I want to preserve</span>...";
s = s.replaceAll("<span\s [^>]*title=(['"])(.*?)\1[^>]*>(.*?)</span>", "($3)");
System.out.println(s);
которое выведет:
noise (something I want to preserve)...
Редактировать
Обратите внимание на комментарий Алана под моим ответом: это предполагает, что у вас нет вложенных <span>
‘s во входных данных.
Комментарии:
1. Это предполагает, что не будет никаких других
<span>
элементов, вложенных внутри того, который вы сопоставляете.
Ответ №2:
Я предлагаю вам использовать одно регулярное выражение для сопоставления всего <span ...>...</span>
. Запишите <span>
в одну группу, а </span>
в другую и используйте группы захвата для выполнения замены.
Ответ №3:
Вместо замены <span>
тегов вы могли бы попытаться извлечь содержимое <span>
тега, а затем заключить его в фигурные скобки.