2

中かっこが一致する行を含むファイルが多数あります。ブラケットが一致しているかどうかは気にしません。

左括弧の後にどちらが最初に来るかを確認することで、中括弧がネストされているかどうかを確認したいと思います - 右括弧または別の左括弧。すべての括弧が一致し、行ごとに最大で 1 つの外側括弧があると仮定します。(つまり[foo[bar]]、は有効な行ですが[foo][bar]、2 番目の角かっこのペアがネストされていないため、そうではありません)。

を使用して、この質問からブラケットペア内のすべてを取得できますが、取得した's/.*\[\([^]]*\)\].*/\1/g'文字列を再テストしてさらに一致させる方法がわかりません。

たとえば、次の文字列があるとします。

foo [ bar, [baz] ]

私が取ると思う手順は次のとおりです。

  1. 左側から開口ブラケットが見えるまでトラバースします。(何も見つからない場合は、その行を無視してください)。
  2. [または のいずれか]に遭遇するまで、左中かっこから貪欲に検索しません。の場合[、括弧がネストされているため、行を返します。もし]

理想的には、sedまたは unix ツール ベースのソリューションが必要ですが、他のものも受け入れられます (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 に答える