正则表达式连续两个特殊字符

时间:2013-06-16 22:19:09

标签: regex

我有这个正则表达式 \[.+\]\(.+\)

为什么它完全匹配这个字符串?

[test1](test1) thisbitshouldnotmatch [test2](test2)

它应该只匹配[test1](test1)[test2](test2)thisbitshouldnotmatch不应该匹配。

3 个答案:

答案 0 :(得分:7)

这是因为+运算符贪婪

对于表达式\[.+\]\(.+\),字符匹配如下:

[test1](test1) thisbitshouldnotmatch [test2](test2)
[..........................................](.....)

所以,整个输入匹配!

你需要使用nongreedy:

\[.+?\]\(.+?\)

或者,显性禁止某些字符

\[[^\]]+\]\([^)]+\)

(注意我是如何用一个分别排除.]的字符组替换catch-any )的``

答案 1 :(得分:5)

尝试使用此表达式:

\[.+?\]\(.+?\)

这将限制结果,因此它仅匹配[]()第一个出现次数。请注意,默认情况下,诸如此类的表达式.+将尝试尽可能多地匹配输入。通过在末尾添加?量词:.+?,我们指定搜索应该在找到的第一个匹配项处停止。

答案 2 :(得分:4)

你需要让点懒惰,否则它会抓住所有

\[.+?]\(.+?\)

或者,更好的是,使用否定的字符类,因此[后跟许多not ]后跟]

\[[^]]++]\([^)]++\)

另请注意,您无需转义]