【发布时间】:2012-02-15 20:06:58
【问题描述】:
我需要一个正则表达式,它可以在可能包含匹配括号的字符串中找到任何不匹配的大括号(打开或关闭)。
stackoverflow 上存在这个问题,但我还没有找到有效的基于正则表达式的解决方案。
我想出了一个正则表达式,它使用负前瞻查找不匹配的左大括号 \((?![^)]+\)),但我似乎无法找出不匹配的右大括号所需的相反的表达式。
编辑:上述用于查找不匹配的左大括号的正则表达式无法按预期工作。例如。它会错过多个左大括号后跟一个右大括号的情况(另请参见 cmets)
这是我在 Rubular 上试验的测试字符串:
one) ((two) (three) four) (five)))
请注意,字符串可以包含任何类型的字符,包括引号、破折号等。
【问题讨论】:
-
那是因为在一般情况下没有基于正则表达式的解决方案。这和你cannot parse XML with regex 的原因相同(同样,在一般情况下)。
-
真的必须是正则表达式吗?为什么不使用
string.each_char { |c| ... }进行简单循环? -
没有严格的正则表达式语言可以。但是像 PCRE 这样的常见扩展正则表达式可能可以。见stackoverflow.com/questions/562606/…
-
您的正则表达式并没有按照您的想法执行。它会找到任何
(后面没有)。例如((2+3)将不会显示任何不匹配的(,因为它们都在某个时间点后面跟着) -
大卫,你说得对。负前瞻只是确保有一个右括号 somewhere 并且会错过您提到的情况。