我有这个正则表达式
\[.+\]\(.+\)
为什么它完全匹配这个字符串?
[test1](test1) thisbitshouldnotmatch [test2](test2)
它应该只匹配[test1](test1)
和[test2](test2)
。thisbitshouldnotmatch
不应该匹配。
我有这个正则表达式
\[.+\]\(.+\)
为什么它完全匹配这个字符串?
[test1](test1) thisbitshouldnotmatch [test2](test2)
它应该只匹配[test1](test1)
和[test2](test2)
。thisbitshouldnotmatch
不应该匹配。
那是因为+
运营商是贪婪的。
对于表达式\[.+\]\(.+\)
,字符匹配如下:
[test1](test1) thisbitshouldnotmatch [test2](test2)
[..........................................](.....)
所以,整个输入匹配!
您需要使用非贪婪:
\[.+?\]\(.+?\)
或者,明确禁止某些字符
\[[^\]]+\]\([^)]+\)
(注意我如何用排除或分别.
的字符组替换 catch-any )`]
)
试试这个表达式:
\[.+?\]\(.+?\)
这将限制结果,因此它只匹配 和 的第一次出现。请注意,默认情况下,像这样的表达式:将尝试匹配尽可能多的输入。通过在末尾添加一个量词:我们指定搜索应该在它找到的第一个匹配项处停止。[]
()
.+
?
.+?
你需要让点变得懒惰,否则它会抓住它可以抓住的一切:
\[.+?]\(.+?\)
或者,更好的是,使用否定字符类,所以 a[
后跟 manynot ]
后跟 a]
\[[^]]++]\([^)]++\)
另请注意,您不需要逃避]