【问题标题】:Perl nested parentheses expressionPerl 嵌套括号表达式
【发布时间】:2016-03-15 00:28:29
【问题描述】:

如何使用 perl 正则表达式提取最外圆括号内的内容?

文本 = (-(A + (B - C)))

输出 = -(A + (B - C))

谢谢

【问题讨论】:

    标签: regex perl nested expression parentheses


    【解决方案1】:

    可以用这个(\(((?:[^()]++|(?1))*)\))完成,有几个
    方法来做到这一点。

    Formatted and tested:

     (                       # (1 start), Recursion code group
          \(                      # Opening (
          (                       # (2 start), Capture, inner core
               (?:                     # Cluster group
                    [^()]++                 # Possesive, not parenth's
                 |                        # or,
                    (?1)                    # Recurse to group 1
               )*                      # End cluster, do 0 to many times
          )                       # (2 end)
          \)                      # Closing )
     )                       # (1 end)
    

    输出

     **  Grp 0 -  ( pos 4 , len 16 ) 
    (-(A + (B - C)))  
     **  Grp 1 -  ( pos 4 , len 16 ) 
    (-(A + (B - C)))  
     **  Grp 2 -  ( pos 5 , len 14 ) 
    -(A + (B - C))  
    

    【讨论】:

    • 我还没有测试过,但我希望以下内容会更快,因为它只会在必须时尝试递归:\( ( [^()]* (?: \( (?1) \) [^()]* )* ) \)
    • @ikegami 我认为++ 应该使它们几乎相同
    • @ikegami - 是的,它看起来比交替快 %30。某种展开的循环遇到递归。
    • 这是不必要的详尽。 OP不要求测试字符串以确保括号平衡,只是提取最外面对中的字符串
    • @ikegami - 您展开的递归循环非常棒!感谢您的提示!
    【解决方案2】:

    我认为除了这个之外没有其他要求

    use strict;
    use warnings 'all';
    
    my $text = "(-(A + (B - C)))";
    
    my ($result) = $text =~ / \( (.*) \) /x;
    
    print $result, "\n";
    

    输出

    -(A + (B - C))
    

    该模式捕获从第一个左括号之后到最后一个右括号之前的所有内容。从你的问题来看,我认为不需要检查琴弦是否平衡

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-27
      • 2020-02-14
      • 2014-10-09
      • 1970-01-01
      • 2013-06-14
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多