正则表达式匹配如何工作?

时间:2012-10-09 07:46:18

标签: java regex

这个问题是本论坛中另一个问题的推导,我认为这个问题很简单,但最终发现了一个难题。

OP要求使用xyz替换所有子字符串<tagname>xyz</tagname>中的任何文字NEW TEXT。我做了以下事情:

String str="<tagname>bgerh</tagname>sdfghuhjg<tagname>bgew</tagname>rwesdgrhtf<tagname>bfgh</tagname>";

System.out.println(str.replaceAll("(?<=(<tagname>)).*(?=(</tagname>))","NEW TEXT"));

我得到的输出:

<tagname>NEW TEXT</tagname>

这显然不是理想的。

所以,我想知道正则表达式检查是否从字符串的两端发生,我将很高兴看到该示例的解决方案。 提前致谢。

2 个答案:

答案 0 :(得分:6)

.*是一个贪婪的量词,意味着它将匹配它所能做的一切。由于您的示例字符串以<tagname>开头,以</tagname>结尾,因此其间的所有内容都将与.*匹配。

要解决这个问题,你可以使用一个不情愿的量词,它只会尽可能少地抓取。不情愿的限定符看起来像这样:.*?,因此整个表达式看起来像这样:

"(?<=<tagname>).*?(?=</tagname>)"

答案 1 :(得分:1)

我通常会通过从正则表达式的内部排除<来完成此操作。像:

(?<=<tagname>)[^<]*(?=</tagname>)