2012-09-21 138 views
2

我有大量的文件包含帶有大括號的大括號。我做而不是如果括號匹配或不相符。正則表達式來檢查括號是否嵌套

我想檢查是否有任何大括號嵌套,通過檢查哪些第一次後左括號 - 閉幕或另一個開放括號。我假設所有的括號是匹配的,並且每行最多隻有一個外括號。 (即,[foo[bar]]是有效行,[foo][bar]不是,因爲第二對括號不是嵌套的)。

我可以從this question使用's/.*\[\([^]]*\)\].*/\1/g'得到括號內的所有內容,但我不確定如何重新測試抓取的字符串以進一步匹配。

例如,給定以下字符串:

foo [ bar, [baz] ] 

我想我會採取的步驟是:從左側

  1. 遍歷,直到我看到的開口支架。 (如果沒有找到,則忽略該行)。
  2. 從開口大括號中進行非貪婪搜索,直到遇到[]。如果[,括號嵌套,則返回該行。如果]

理想我想基於sed或Unix工具的解決方案,但其它是可接受的(perl,例如)。任何幫助,將不勝感激。

+0

你關心嵌套括號的水平或如果這種嵌套的支架存在根本不理? – gtgaxiola

+0

@gtgaxiola我只關心線條,如果至少有一個嵌套支架 - 我不在乎這一點的嵌套支架的水平​​。 – simont

回答

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

它會匹配'[foo] [bar]' – Toto

+0

@ M42 ..correct – Vijay

2

使用遞歸正則表達式來檢查括號匹配,並且它們是嵌套的。它無需檢查嵌套而沒有語法檢查,這可以打破檢查結果。例如:

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

Recursive regexp

+0

+1:很有趣,讓我感覺很棒。 –