2012-06-02 6 views
5

У меня длинная строка. Я хочу заменить все совпадения частью соответствующего регулярного выражения (группы).Заменить строку частью соответствующего регулярного выражения

Например:

String = "This is a great day, is it not? If there is something, THIS IS it. <b>is</b>". 

Я хочу, чтобы заменить все слова "is" от, скажем, "<h1>is</h1>". Случай должен оставаться таким же, как оригинал. Таким образом, окончательный строки я хочу это:

This <h1>is</h1> a great day, <h1>is</h1> it not? If there <h1>is</h1> something, 
THIS <h1>IS</h1> it. <b><h1>is</h1></b>. 

Регулярное выражение я пытался:

Pattern pattern = Pattern.compile("[.>, ](is)[.<, ]", Pattern.CASE_INSENSITIVE); 
+2

Когда вы пробовали, что случилось? –

+0

Шаблон соответствует штрафу. Я не понимаю, как заменить. – varunl

ответ

8

Класс Matcher обычно используется в сочетании с Pattern. Используйте метод Matcher.replaceAll(), чтобы заменить все совпадения в строке

String str = "This is a great day..."; 
Pattern p = Pattern.compile("\\bis\\b", Pattern.CASE_INSENSITIVE); 
Matcher m = p.matcher(str); 
String result = m.replaceAll("<h1>is</h1>"); 

Примечание: Использование регулярных выражений команды \b будет соответствовать на границе слова (например, пробел). Это полезно использовать для обеспечения соответствия только слова «есть», а не слов, содержащих буквы «i» и «s» (например, «остров»).

4

Как это:

str = str.replaceAll(yourRegex, "<h1>$1</h1>"); 

$1 относится к тексту, захваченной группы № 1 в ваше регулярное выражение.

+0

Недостатком этого решения является то, что он всегда будет чувствителен к регистру. Невозможно определить регулярное выражение для нечувствительности к регистру. – Michael

+2

@Michael - Просто включите модификатор '(? I)' в начале регулярного выражения, если вам нужна нечувствительность к регистру. –

+0

О, не знал этого.Игнорируйте мой комментарий. :( – Michael

0

Просто используйте обратную ссылку для этого.

"This is a great day, is it not? If there is something, THIS IS it. <b>is</b>".replaceAll("[.>, ](is)[.<, ]", "<h1>$2</h1>"); следует делать.

+0

Опять же, вы не можете сказать регулярному выражению нечувствительность к регистру с этим решением. – Michael

+0

Nevermind, вы можете добавить строку регулярных выражений в '(? I)', чтобы сделать регистр нечувствительным. – Michael

3

ответ Майкла лучше, но если вы будете специально хотят только [.>, ] и [.<, ] как границы, вы можете сделать это следующим образом:

String input = "This is a great day, is it not? If there is something, THIS IS it. <b>is</b>"; 
Pattern p = Pattern.compile("(?<=[.>, ])(is)(?=[.<, ])", Pattern.CASE_INSENSITIVE); 
Matcher m = p.matcher(input); 
String result = m.replaceAll("<h1>$1</h1>"); 
1
yourStr.replaceAll("(?i)([.>, ])(is)([.<, ])","$1<h1>$2</h1>$3") 

(?i), чтобы указать, без учета регистра; оберните все, что вы хотите повторно использовать с помощью скобок, повторно используйте их с $ 1 $ 2 и $ 3, объедините их в то, что вы хотите.

0

Это может быть последнее дополнение, но если кто-то ищет это как
Ищете «вещь», а также он должен «нечто» тоже должны быть приняты в качестве результата,

шаблон р = Pattern.compile ("([^] ) is ([^ \.])");
Строковый результат = m.replaceAll ("< \ h1> $ 1is $ 2 </h1>");

приведет < \ h1> Что-то </h1> тоже

Смежные вопросы