2016-03-18 58 views
3

我在镐Ruby文中发现了一个正则表达式,用于寻找平衡的大括号表达式,我试图在它上面构建一个匹配平衡大括号/括号/ parens的正则表达式。红宝石中的平衡大括号/括号/ parens正则表达式

原:

re =/
    \A 
    (?<brace_expression> 
     { 
     (
      [^{}]     # anything other than braces 
     |      # ...or... 
      \g<brace_expression> # a nested brace expression 
     )* 
     } 
    ) 
    \Z 
/x 

我的版本至今:

re =/
    \A 
    (?<brace_expression> 
     (?: 
     (?<brace> {) | (?<bracket> \[) | (\() 
    ) 
     (
      [^{}\[\]()]   # anything other than braces 
     |      # ...or... 
      \g<brace_expression> # a nested brace expression 
     )* 
     (?(<brace>) } | (?(<bracket>) \] | \))) 
    ) 
    \Z 
/x 

它正确地匹配 “{XYZ}”, “[XYZ]”, “(XYZ)”,并正确失败以匹配“{xyz]”之类的内容,但递归并不像我预期的那样。它无法匹配嵌套括号表达式,如“{[]}”。我错过了什么?

回答

1

有趣的问题。你目前的模式看起来不错。如何使用替代条件而不是使用递归时似乎不可靠的条件。

re =/
    \A(       # start group 1 
    \(([^)(\]\[}{]+|\g<1>)*+\)| # parens & set group 2 
    \[\g<2>*+\]|     # brackets 
    \{\g<2>*+\}     # braces 
)\z       # group 1 end 
/x 
  • \g<1>是到保存开始和结束之间的图案的第一基团。
  • \g<2>是对组2的调用,其中[^)(\]\[}{]+|\g<1>reducing the pattern
  • *+是一个possessivequantifier如果不平衡改善失败的表现。

See demo at Regex101 (PCRE)Rubular v1.9.3+