2011-01-27 9 views
2

大きなテキストファイルの複数の行にまたがる空のXMLタグを見つけるツールを作成しようとしています。例えば。一致していません。正規表現の行番号を複数の行に返す

<tag> 
ABC 
</tag> 

そして試合:

<tag> 
</tag> 

を(私は複数行に渡って空白にマッチする正規表現を書くことに何の問題もないが、私はこれらの一致が発生する行番号を見つける必要がありますほぼ少なくとも)。

私はテキストファイルを配列に分割しますが、2行以上のタグ/空白がある可能性があるため、複数の配列要素を照合するのはかなり難しいでしょう。

アイデア?私の実装はPerlで行う必要があります。ありがとう!

+1

がhttp://stackoverflow.com/questions/1732348/regex-を参照してください:-)下記参照match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – Svante

+0

Svanteが与えたリンク+1億回。あなたがそれを見逃した場合に備えて、http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

答えて

3

この種の作業では、むしろxmlパーサを使用して、空のタグの行番号を出力するのは面倒な正規表現の作業を行うよりもむしろです。

4
if ($string =~ $regex) { 
    print "Match starting line number: ", 1 + substr($string,0,$-[0]) =~ y/\n//, "\n"; 
} 
0

一つだけ<tag>行あたりがある場合は、現在の行番号が含まれているspecail変数$.を使用することができます。

#!/usr/bin/perl 
use strict; 
use warnings; 
use 5.10.1; 

my ($begin, $tag) = (0, 0, ''); 
while (my $line = <DATA>) { 
    chomp $line; 
    if ($line =~ m#<(tag).*?>#) { 
    $tag = $1; 
    $begin = $.; 
    next; 
    } 
    if ($line =~ m#</($tag).*?>#) { 
    if ($. - $begin < 2) { 
     say "Empty tag '$tag' on lines $begin - $."; 
    } 
    $begin = 0; 
    $tag = ''; 
    } 
} 

__DATA__ 
<tag> 
ABC 
</tag> 

<tag> 
</tag> 

出力:あなたは堅牢なソリューションが必要な場合は

Empty tag 'tag' on lines 5 - 6 
0

は、実際のXMLパーサではなく、単純なパターンマッチングを使用します。

あなたは常に正しい答えを与えないことが脆弱なアプローチを使用する用意がある場合は、 その後

#!/usr/bin/perl 
use warnings; 
use strict; 

my $xml =<<ENDXML; 
<tag> 
stuff 
</tag> 
<tag> 


</tag> 
<p> 
paragraph 
</p> 
<tag> </tag> 
<tag> 
morestuff 
</tag> 
ENDXML 

while ($xml =~ m#(<tag>\s*</tag>)#g) { 
    my $tag = $1; 

    # use substr() as an "lvalue" to find number of lines before </tag> 
    my $prev_lines = substr($xml, 0, pos($xml)) =~ tr/\n// + 1; 

    # adjust for newlines contained in the matched element itself 
    my $tag_lines = $tag =~ tr/\n//; 

    my $line = $prev_lines - $tag_lines; 
    print "lines $line-$prev_lines\n$tag\n"; 
}