5

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

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

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

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

4

3 回答 3

7

那是因为+运营商是贪婪的。

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

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

所以,整个输入匹配!

您需要使用非贪婪:

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

或者,明确禁止某些字符

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

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

于 2013-06-16T22:23:39.913 回答
5

试试这个表达式:

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

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

于 2013-06-16T22:24:54.243 回答
4

你需要让点变得懒惰,否则它会抓住它可以抓住的一切

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

或者,更好的是,使用否定字符类,所以 a[后跟 manynot ]后跟 a]

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

另请注意,您不需要逃避]

于 2013-06-16T22:26:05.687 回答