用于检查括号是否嵌套的正则表达式

时间:2012-09-21 04:06:47

标签: linux perl sed

我有大量文件,其中包含匹配大括号的行。如果括号匹配与否,我小心。

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

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

例如,给定以下字符串:

foo [ bar, [baz] ]

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

  1. 从左侧移动,直到我看到一个开口支架。 (如果找不到,请忽略该行)。
  2. 非常贪婪地从左大括号搜索,直到遇到[]。如果[,括号嵌套,则返回该行。如果]
  3. 理想情况下,我想要基于sed或基于unix工具的解决方案,但其他解决方案是可接受的(例如perl)。任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:2)

使用递归正则表达式检查括号匹配并且它们是嵌套的。在没有语法检查的情况下检查嵌套是没有意义的,这可以突破检查结果。例如:

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

Recursive regexp

答案 1 :(得分: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] ]
>