我有这个正则表达式
\[.+\]\(.+\)
为什么它完全匹配这个字符串?
[test1](test1) thisbitshouldnotmatch [test2](test2)
它应该只匹配[test1](test1)
和[test2](test2)
。 thisbitshouldnotmatch
不应该匹配。
答案 0 :(得分:7)
这是因为+
运算符贪婪。
对于表达式\[.+\]\(.+\)
,字符匹配如下:
[test1](test1) thisbitshouldnotmatch [test2](test2)
[..........................................](.....)
所以,整个输入匹配!
你需要使用nongreedy:
\[.+?\]\(.+?\)
或者,显性禁止某些字符
\[[^\]]+\]\([^)]+\)
(注意我是如何用一个分别排除.
或]
的字符组替换catch-any )
的``
答案 1 :(得分:5)
尝试使用此表达式:
\[.+?\]\(.+?\)
这将限制结果,因此它仅匹配[]
和()
的第一个出现次数。请注意,默认情况下,诸如此类的表达式.+
将尝试尽可能多地匹配输入。通过在末尾添加?
量词:.+?
,我们指定搜索应该在找到的第一个匹配项处停止。
答案 2 :(得分:4)
你需要让点懒惰,否则它会抓住所有:
\[.+?]\(.+?\)
或者,更好的是,使用否定的字符类,因此[
后跟许多not ]
后跟]
\[[^]]++]\([^)]++\)
另请注意,您无需转义]