这个问题是本论坛的另一个问题的衍生,我认为这很简单,但最后却发现了一个难题。
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/