2

我有大量文件,其中包含带有匹配大括号的行。我不在乎括号是否匹配。

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

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

例如,给定以下字符串:

foo [ bar, [baz] ]

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

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

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

4

2 回答 2

2

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

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

递归正则表达式

于 2012-09-21T04:40:00.437 回答
0
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] ]
> 
于 2012-09-21T06:04:10.103 回答