使用匹配的正则表达式的一部分替换字符串

14

我有一个长字符串,想要用匹配正则表达式(组)的部分替换所有匹配项。

例如:

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
当你尝试了它,发生了什么? - Tony Ennis
模式匹配得很好。我不明白的是如何进行替换。 - varunl
6个回答

16

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正则表达式命令将匹配单词边界(比如空格)。这对于确保只匹配单词“is”,而不是包含字母“i”和“s”的单词(如“island”)非常有帮助。


12

就像这样:

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

$1指的是在您的正则表达式中,由第1组捕获的文本。


这种解决方案的缺点是它始终区分大小写。无法定义正则表达式为不区分大小写。 - Michael
2
@Michael - 如果你需要不区分大小写的正则表达式,只需在正则表达式开头加上(?i)修饰符即可。 - Jirka Hanika
哦,不知道呢。忽略我的评论。:( - Michael
只是让你知道,你帮助了一个六年后的人! - GalAbra
我也想感谢你。我以前从未找到过一种在某个组中找到文本并替换文本的方法! - Sheyko Dmitriy

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>");

2
yourStr.replaceAll("(?i)([.>, ])(is)([.<, ])","$1<h1>$2</h1>$3")

(?i)表示忽略大小写;用括号包含需要重复使用的内容,可以用$1 $2和$3进行重复使用,并将它们连接成您想要的内容。


0

只需使用反向引用即可。

"This is a great day, is it not? If there is something, THIS IS it. <b>is</b>"
  .replaceAll("[.>, ](is)[.<, ]", "<h1>$2</h1>");

应该做的事情。

请注意,使用此解决方案无法将正则表达式设置为不区分大小写。 - Michael
没关系,你可以在正则表达式字符串前加上(?i)来使它不区分大小写。 - Michael

0

这可能是一个后期添加的功能,但如果有人像搜索thing一样,并且他还需要将Something作为结果返回。

Pattern p = Pattern.compile("([^ ]*)is([^ \\.]*)");
String result = m.replaceAll("<\h1>$1is$2<\/h1>");

将会返回Something


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接