Java — Замените все регулярным выражением, затем замените первое появление строки

#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> тега, а затем заключить его в фигурные скобки.