2016-11-29 2 views
1
@matches = ($filestr =~ /^[0-9]+\. (.+\n)*/mg); 

私はfilestrに読み込まれたファイルを持っていますが、何らかの理由で上記の正規表現は行の先頭に一致し、その後に数字、ドット、空白、その後に改行が続く任意の数の行(改行のみの行がある場合に終了する)は、ファイルからいくつかの単一の行を生成するように見えます。なぜこのperlの正規表現は動作しません

私は

@matches = ($filestr =~ /^[0-9]+\. .+\n/mg); 

ような何かをするとき、私は正しく、単一の行に一致します。私はこの

@matches = ($filestr =~ /^[0-9]+\. .+\n.+\n/mg); 

は、私はいくつかの一見無関係に見えるラインに続いて、同じ単一の行と一致しない

。私の正規表現で何が間違っていますか?

注:正規表現はこの正規表現テスターで正常に動作します:https://regex101.com/、それはperlでは動作しません。

例、本書に:

1. This should 
match 

2. This should too 

3. This 
one 
also 

正規表現が一致しなければならない

1. This should 
match 

2. This should too 

3. This 
one 
also 
+0

だけFYI:改行が遊びに来たときに、代わりに '' \のN 'の\のR'を使用することを検討してください。しかし、ここでは全体的なアプローチを変更し、後続の行ごとに行単位でチェックする方がよいでしょう。 –

+0

提案していただきありがとうございます。私は\ Rを試しましたが、\ nと同じ結果が得られます。 –

+0

提案した方法で行ごとにチェックする良い方法を知っていますか?私は本質的に手動で正規表現を分割するように思えます。最初に^ [0-9] + \と一致する行があるかどうかを確認します。最初の行の残りの部分とそれに続くすべての行に一致する行があるかどうかをチェックします(1つの改行がある行があるまで、再起動する必要があります)。 –

答えて

2

あなたの正規表現は正しいです。しかし、結果を部分的にキャプチャしています。試合全体を1つの結果セットに取り込むことをお勧めします。それが@matchesに格納される方法です。

したがって、正しい正規表現は/(^[0-9]+\. (?:.+\n)*)/gmになります。このようにして、一致結果を$1にキャプチャします。それをプログラムにラップすると、結果が得られます。

何かをキャプチャしない限り、デフォルトでは$&(つまり完全一致)がかかりますので、かっこを残さずに動作しますが、(...)も動作します。この場合、グループ()の代わりにnon-capturing group(?: ...)を使用する必要があります。

#!/usr/bin/perl 
use strict; 
use warnings; 
use Data::Dumper; 

my $str = ' 
1. This should 
match 

2. This should too 

3. This 
one 
also 
'; 

my @matches = $str =~ /^([0-9]+\. (?:.+\n)*)/gm; 

print Dumper(\@matches); 

出力:

[ 
      '1. This should 
match 
', 
      '2. This should too 
', 
      '3. This 
one 
also 
' 
     ]; 
1

このような状況では、ファイルを行単位で読むのではなく、段落単位で読む必要があります。これを行うには、$/を空文字列に設定する必要があります。例:

use strict; 
use warnings; 

my @result; 

{ 
    local $/ = ""; 
    while (<DATA>) { 
     chomp; 
     push @result, $_ ; 
     # or to filter paragraphs that don't start with a digit, use instead: 
     # push @result, $_ if /^[0-9]+\./; 
    } 
} 


__DATA__ 
1. This should 
match 

2. This should too 

3. This 
one 
also 
関連する問題