【问题标题】:Regular expression to check if brackets are nested检查括号是否嵌套的正则表达式
【发布时间】:2012-09-13 11:55:38
【问题描述】:

我有大量包含匹配大括号的行的文件。我确实关心括号是否匹配。

我想检查是否有任何大括号嵌套,方法是检查左括号之后哪个先出现 - 一个右括号或另一个左括号。我假设所有括号都匹配,并且每行最多有一个外括号。 (即,[foo[bar]] 是有效行,[foo][bar] 不是,因为第二个括号对没有嵌套)。

我可以使用's/.*\[\([^]]*\)\].*/\1/g'this question 获取括号对中的所有内容,但我不确定如何重新测试抓取的字符串以进行进一步匹配。

例如,给定以下字符串:

foo [ bar, [baz] ]

我认为我会采取的步骤是:

  1. 从左侧遍历直到我看到一个左括号。 (如果没有找到,忽略该行)。
  2. 从左大括号开始进行非贪婪搜索,直到遇到[]。如果[,括号是嵌套的,所以返回该行。如果]

理想情况下,我想要一个 sed 或基于 unix-tool 的解决方案,但其他解决方案是可以接受的(例如 perl)。任何帮助,将不胜感激。

【问题讨论】:

  • 你关心嵌套括号的级别还是直接忽略嵌套括号是否存在?
  • @gtgaxiola 我只关心至少有一个嵌套括号的行 - 我现在不关心嵌套括号的级别。

标签: linux perl sed


【解决方案1】:

使用递归正则表达式检查括号是否匹配并且它们是嵌套的。没有语法检查就检查嵌套是没有意义的,因为这可能会破坏检查结果。例如:

my $regex = qr/\[([^\[\]]+?|(??{$regex}))*\]/;
if( $line =~ /^[^\[\]]*\[$regex\][^\[\]]*$/ ) #Valid

【讨论】:

    【解决方案2】:
    perl -ne 'print if /\[[^\]]*\[/' your_file
    

    测试如下:

    > cat temp
    foo [ bar, [baz] ]
    foo [ bar, baz ]
    foo [ bar ]
    foo [ bar, baz] ]
    foo  bar, [baz] ]
    > perl -ne 'print if /\[.*\[/' temp
    foo [ bar, [baz] ]
    > 
    

    【讨论】:

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