这个问题是本论坛中另一个问题的推导,我认为这个问题很简单,但最终发现了一个难题。
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>
这显然不是理想的。
所以,我想知道正则表达式检查是否从字符串的两端发生,我将很高兴看到该示例的解决方案。 提前致谢。
答案 0 :(得分:6)
.*
是一个贪婪的量词,意味着它将匹配它所能做的一切。由于您的示例字符串以<tagname>
开头,以</tagname>
结尾,因此其间的所有内容都将与.*
匹配。
要解决这个问题,你可以使用一个不情愿的量词,它只会尽可能少地抓取。不情愿的限定符看起来像这样:.*?
,因此整个表达式看起来像这样:
"(?<=<tagname>).*?(?=</tagname>)"
答案 1 :(得分:1)
我通常会通过从正则表达式的内部排除<
来完成此操作。像:
(?<=<tagname>)[^<]*(?=</tagname>)