2

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

OP 要求用 some替换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>

这显然不是想要的。

所以,我想知道正则表达式检查是否发生在字符串的两端,我会对这个例子的解决方案感到高兴。提前致谢。

4

2 回答 2

6

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

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

"(?<=<tagname>).*?(?=</tagname>)"
于 2012-10-09T07:50:00.633 回答
1

我通常会通过<从正则表达式的内部排除来做到这一点。像:

(?<=<tagname>)[^<]*(?=</tagname>)
于 2012-10-09T07:54:51.973 回答