簡體   English   中英

Ruby中的平衡括號/括號/ parens正則表達式

[英]Balanced braces/brackets/parens regex in Ruby

我在pickaxe Ruby書中找到了一個用於尋找平衡括號表達式的正則表達式,我正試圖在它上面建立一個匹配平衡括號/括號/ 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]”之類的東西,但遞歸並不像我期望的那樣。 它無法匹配像“{[]}”這樣的嵌套大括號表達式。 我錯過了什么?

有趣的問題。 您當前的模式看起來非常好。 使用交替而不是與遞歸一起使用時看起來不可靠的條件怎么樣?

re = /
  \A(                            # start group 1
    \(([^)(\]\[}{]+|\g<1>)*+\)|  # parens & set group 2
    \[\g<2>*+\]|                 # brackets
    \{\g<2>*+\}                  # braces
  )\z                            # group 1 end
/x
  • \\g<1>是對第一組的子表達式調用 ,它保存start和end之間的模式。
  • \\g<2>是對組2的調用,其保持[^)(\\]\\[}{]+|\\g<1>減少模式
  • *+是一種占有 量詞,用於在不平衡時改善失敗性能。

請參閱Regex101(PCRE)Rubular v1.9.3 +的 演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM