使用像perl这样的递归正则表达式匹配Ruby中的平衡括号

Yet*_*eek 13 ruby regex perl

我一直在寻找一种方法来匹配正则表达式中的平衡括号,并在Perl中找到了一种使用递归正则表达式的方法:

my $re;
$re = qr{
           \(
              (?:
                 (?> [^()]+ )       # Non-parens without backtracking
                 |
                 (??{ $re })        # Group with matching parens
              )*
           \)
         }x;
Run Code Online (Sandbox Code Playgroud)

来自perl正则表达式网站 .

有没有办法在Ruby或类似语言中执行此操作?

更新:

对于那里感兴趣的人有一些有趣的链接:

Oniguruma手册 - 来自Sawa的回答.

实用程序员的Ruby 1.9正则表达式示例章节

saw*_*awa 20

是.使用oniguruma正则表达式引擎,它内置在Ruby 1.9中,可以在Ruby 1.8上安装,你可以做到这一点.用(?<name>...)or 命名subregex (?'name'...).然后调用一个subregex用\g<name>\g'name'相同的正则表达式中.所以你的正则表达式转换为oniguruma正则表达式将是:

re = %r{
  (?<re>
    \(
      (?:
        (?> [^()]+ )
        |
        \g<re>
      )*
    \)
  )
}x
Run Code Online (Sandbox Code Playgroud)

另请注意,PHP> = 5的多字节字符串模块使用oniguruma regex引擎,因此您将能够执行相同的操作.

oniguruma手册在这里.

  • 然后有人更新[维基百科页面](http://en.wikipedia.org/wiki/Comparison_of_regular_expression_engines).不过,我更喜欢[这个更简单的答案](http://stackoverflow.com/questions/4840988/the-recognizing-power-of-modern-regexes/4843579#4843579)使用`\((?:[^( )]*+ |?(0))*\)`. (4认同)
  • @sawa很高兴.Oniguruma有许多有趣的功能,但它也有重大错误,比如在正则表达式级别处理物理序列化(编码)而不是总是在虚拟代码点处理.这是一个令人头痛的问题,并且是一个重大违规行为:[第1级:基本的Unicode支持.在此级别,正则表达式引擎提供对Unicode字符的支持作为基本逻辑单元.(这与Unicode的实际序列化无关,如UTF-8,UTF-16BE,UTF-16LE,UTF-32BE或UTF-32LE.)这是有用的Unicode支持的最低级别.](http:// unicode .org/reports/tr18 /)看到了? (3认同)
  • @sawa:好事!但是你最好改变对'Some`的支持:Oniguruma只支持Gᴇɴᴇʀᴀʟ_Cᴀᴛᴇɢᴏʀʏ+几个Sᴄʀɪᴘᴛs.Uɴɪᴄᴏᴅᴇ道具支持有4⁺级:⑴[RL1.2要求的所有11个道具](http://unicode.org/reports/tr18/#Categories); ⑵比较'\ w`&ᶜ[每个RL1.2A]的道具(http://unicode.org/reports/tr18/#Compatibility_Properties); ⑶命名字符如`\ N {POUND SIGN}`[每RL2.5](http://unicode.org/reports/tr18/#Name_Properties); ⑷完全支持*所有道具*[每个RL2.7](http://unicode.org/reports/tr18/proposed.html#Full_Properties).**Perl和ICU满足所有④; Ruby遇见⓪.** (2认同)