[英]How does a regex matching work?
这个问题源于本论坛中的另一个问题,我认为这很简单,但最后却发现了一个难题。
OP要求将所有子字符串<tagname>xyz</tagname>
的所有文本xyz
替换为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>)"
我通常通过在正则表达式的内部排除<
来做到这一点。 喜欢:
(?<=<tagname>)[^<]*(?=</tagname>)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.