繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM