Java - заменить все на регулярное выражение, а затем заменить первое вхождение строки - PullRequest
1 голос
/ 11 ноября 2011

У меня есть эта строка с 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>", ")");
}

Я работаю, но заменяет все теги </span>; Я хочу заменить только тот, который соответствует открывающему тегу, который я только что сопоставил.

Ответы [ 3 ]

6 голосов
/ 11 ноября 2011

Почему бы не сделать это за один 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> в ваши данные.

3 голосов
/ 11 ноября 2011

Я предлагаю вам использовать одно регулярное выражение для сопоставления всего <span ...>...</span>. Захватите <span> в одной группе и </span> в другой и используйте группы захвата для замены.

1 голос
/ 11 ноября 2011

Вместо замены тегов <span> вы можете попытаться извлечь содержимое тега <span>, а затем заключить его в фигурные скобки.

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