2016-03-18 94 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+