Ruby 正则表达式查找不匹配的括号

Ruby 正则表达式查找不匹配的括号,ruby,regex,Ruby,Regex,我需要一个正则表达式,它可以在可能包含匹配括号的字符串中找到任何不匹配的大括号(开始或结束) stackoverflow存在这个问题,但我还没有找到一个基于正则表达式的解决方案 我提出了一个正则表达式,它使用负向前看来查找不匹配的大括号\((?![^)]+\),但我似乎无法找出不匹配的大括号所需的相反的一个 编辑:上述用于查找不匹配的大括号的正则表达式无法正常工作。例如,如果多个开放大括号后面紧跟着一个闭合大括号,则会错过这种情况(另请参见注释) 这是我在Rubular上试验的测试字符串: on

我需要一个正则表达式,它可以在可能包含匹配括号的字符串中找到任何不匹配的大括号(开始或结束)

stackoverflow存在这个问题,但我还没有找到一个基于正则表达式的解决方案

我提出了一个正则表达式,它使用负向前看来查找不匹配的大括号
\((?![^)]+\)
,但我似乎无法找出不匹配的大括号所需的相反的一个

编辑:上述用于查找不匹配的大括号的正则表达式无法正常工作。例如,如果多个开放大括号后面紧跟着一个闭合大括号,则会错过这种情况(另请参见注释)

这是我在Rubular上试验的测试字符串:

one) ((two) (three) four) (five)))

请注意,字符串可以包含任何类型的字符,包括引号、破折号等。

简短的回答是,找不到与正则表达式不匹配的括号。正则表达式进行编码,而所有正确匹配的括号的语言都是a。

这里有一种基于正则表达式的解决方案:)

def平衡?(str,open='(',close='))
re=Regexp.new(“[\\\\{open}\\\\\{close}]”)
str.scan(re).注入(0)do | lv,c|
断开:如果lv<0,则过度闭合
lv+(c==开路?1:-1)
结束==0
结束
s1=“一(二)(三)四(五))”
s2=“((一)((二)(三)四)(五))”
s3=“((一)(二)(三)四)(五)”
放置平衡的?(s1),#=>假
平衡?(s2),#=>正确
平衡?(s3)#=>错误

Ruby的Oniguruma库可以解析LALR(n)语法,包括HTML。引用:


r=Regexp.compile(这是因为在一般情况下没有基于正则表达式的解决方案。这与您(同样,在一般情况下)的原因相同。它真的必须是正则表达式吗?为什么不使用
string.each|char{c| |…}的简单循环呢
?没有严格的regexp语言可以..但是像PCRE这样的普通扩展正则表达式可能可以。请看,您的正则表达式并没有做您认为它可以做的事情。它会发现任何
)后面没有
。例如
((2+3)
将不会显示任何不匹配的
,因为它们后面都有
David,你说得对。负向前看只会确保某个地方有一个结束括号,并且会错过你提到的情况。
def balanced?( str, open='(', close=')' )
  re = Regexp.new( "[\\#{open}\\#{close}]" )
  str.scan(re).inject(0) do |lv,c|
    break :overclosed if lv < 0
    lv + (c==open ? 1 : -1)
  end == 0
end

s1 = "one) ((two) (three) four) (five)))"
s2 = "((one) ((two) (three) four) (five))"
s3 = "((one) ((two) (three) four) (five)"

puts balanced?(s1), #=> false
     balanced?(s2), #=> true
     balanced?(s3)  #=> false
  r = Regexp.compile(<<'__REGEXP__'.strip, Regexp::EXTENDED)
  (?<element> \g<stag> \g<content>* \g<etag> ){0}
  (?<stag> < \g<name> \s* > ){0}
  (?<name> [a-zA-Z_:]+ ){0}
  (?<content> [^<&]+ (\g<element> | [^<&]+)* ){0}
  (?<etag> </ \k<name+1> >){0}
  \g<element>
  __REGEXP__

  p r.match('<foo>f<bar>bbb</bar>f</foo>').captures