2011-01-11 11 views
0

私はテキストを持っており、正規表現とperlを使ってパーサーを作成します。テキスト内の正確な点からマッチングしてマッチングを開始する方法

2つの空白行の後にテキストブロックを認識できるパターンがあるので、私は2つの空行(私はregexpを使用します)と必要なものを一致させることができます。

しかし、問題は、全体のテキストには導入の部分と最後にいくつかのテキストが必要であるということです。ここで

は、テキストと一致するコードには2つの空行

#!/usr/bin/perl 

use strict; 
use warnings; 

my $file = 'first';      
open(my $fh, '<', $file); 
my $empty = 0;  
my $block_num = 1;  
open(OUT, '>', $block_num . '.txt');  

while (my $line = <$fh>) { 

chomp ($line); 
if ($line =~ /^\s*$/) { 
    $empty++;  
    } elsif ($empty == 2) {  
    close(OUT);  
    open(OUT, '>', ++$block_num . '.txt'); 
    $empty = 0; 
    } 
    else { 
    $empty = 0;} 
print OUT "$line\n"; 

} 
close(OUT); 

を見つけたとき、これは私が必要とするテキストの例である(それは本当に小さな:)です)


this is file example

です

私はそれが単語LOREMを見つける瞬間までテキストを繰り返し処理する必要があると思いますこの種の "/^LOREM IPSUM /"は、必要なテキストが始まるポイントであり、単語に到達するとテキストを1つのファイルに保存するため、正規表現を使用しています。 そして、INDEXワードがfountのときにテキストを繰り返し処理するか、別のファイルにテキストを保存する必要があります。

どうすれば実装できますか。私はを次のように使用してください:行を続けるか何か?

BR、 ユリヤ

+1

これは関連する投稿http://stackoverflow.com/questions/4635833/ – yuliya

+0

私はファイルをスラップし、ブロックにマッチします。あなたはちょっと醜いlinecountingで混乱する必要はありませんそのように –

+0

多分あなたは正しいですが、私はコードの一部でそれを行うことを好むだろう – yuliya

答えて

1

あなたが行を処理するまでのLOREM IPSUMで始まる行を、打つまでは、ヘッダ行をスキップします

my $in_lorem = 0; 
while (my $line = <$fh>) { 
    if($line =~ /^LOREM IPSUM/) { 
    $in_lorem = 1; 
    next; 
    } 
    next unless $in_lorem; 
    # your processing goes here 
} 

このような何かにあなたのwhileループを変更したいです。

nextを使用する代わりに、lastを使用する代わりに、それ以上の行を処理する必要がないことを除いて、特定の行が一致した後にすべての行を無視する場合にも同様のパターンを使用します。そのパターンは読者に運動として残されています。 :-)

1

LOREM IPSUMと一致したときに処理を開始し、INDEXと一致したときに処理を開始するには、flip flop range operatorを使用できます。

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

my $file = 'firsttest'; 

open (my $fh, '<', $file) or die "Failed to open $file: $!"; 

while (<$fh>){ 
    if (m/^LOREM IPSUM/ .. m/^INDEX/){ 
     #Do your other matching, processing, etc. here 
     print; 
     last if m/^INDEX/;#Optional, to avoid reading remaining lines. 
    } 
} 
関連する問題