【问题标题】:Balanced braces/brackets/parens regex in RubyRuby中的平衡大括号/括号/括号正则表达式
【发布时间】:2016-03-18 13:46:52
【问题描述】:

我在 pickaxe Ruby 书中发现了一个用于查找平衡大括号表达式的正则表达式,我正在尝试在此基础上构建一个匹配平衡大括号/括号/括号的正则表达式。

原文:

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]”之类的内容,但递归的行为与我预期的不同。它无法匹配像“{[]}”这样的嵌套大括号表达式。我错过了什么?

【问题讨论】:

    标签: ruby regex


    【解决方案1】:

    有趣的问题。您当前的模式看起来相当不错。与递归一起使用时,使用交替而不是似乎不可靠的条件怎么样?

    re = /
      \A(                            # start group 1
        \(([^)(\]\[}{]+|\g<1>)*+\)|  # parens & set group 2
        \[\g<2>*+\]|                 # brackets
        \{\g<2>*+\}                  # braces
      )\z                            # group 1 end
    /x
    

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

    【讨论】:

      猜你喜欢
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      相关资源
      最近更新 更多