正则expression式来检查括号是否嵌套

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

我想检查是否有任何大括号嵌套,通过检查哪一个首先在左括号后面 – 一个closures或另一个开放括号。 我假设所有的括号都是匹配的,每行至多有一个外括号。 (即, [foo[bar]]是一个有效的行, [foo][bar]不是,因为第二对括号没有嵌套)。

我可以使用's/.*\[\([^]]*\)\].*/\1/g'从这个问题中得到括号内的所有内容,但是我不确定如何重新testing抓住了string进一步匹配。

例如,给定以下string:

 foo [ bar, [baz] ] 

我想我会采取的步骤是:

  1. 从左侧穿过,直到我看到一个左括号。 (如果没有find,则忽略该行)。
  2. 从开头大括号非贪婪search,直到遇到[] 。 如果[ ,方括号是嵌套的,所以返回行。 如果]

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

 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] ] > 

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

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

递归正则表达式