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