这个问题是本论坛的另一个问题的衍生,我认为这很简单,但最后却发现了一个难题。

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>


这显然不是想要的。

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

最佳答案

.*是贪婪的量词,表示它将匹配所有可能的内容。因为您的示例字符串以<tagname>开头并以</tagname>结束,所以之间的所有内容都将由.*匹配。

要解决此问题,您可以改用勉强的量词,它只会尽可能少地抓取。勉强的限定符如下所示:.*?,因此整个表达式将如下所示:

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

关于java - 正则表达式匹配如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12795195/

10-12 03:52