- 締切済み
perl 最短マッチについて
以下のコードを実行すると ab が出力されますが理由が分かりません。 if('aabc' =~ /a(.*?)c/){print $1;} $1の部分は最短マッチなので期待値としては b が帰ってくるべきだと思うのですが、 何故このようなことになるのでしょう。(最短マッチは後方のみ有効?) 暇な方よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- entree
- ベストアンサー率55% (405/735)
他の方も言われていますが、正規表現で文字列を探索するときは、 先頭から行なってマッチした時点で結果を返します。 文字列が'aabc' の場合、まずの1つ目の「a」でマッチするかどうかチェックします。 a ab c ( $1 eq 'ab' )でマッチするのでこれで打ち切りです。 確かに2つ目の「a」でもマッチしますが、そこまでチェックされません。 なので、「最短マッチは後方のみ有効?」ということになります。 ちなみに、期待されている動作にしたい場合は下記のように書く必要があるでしょう。 if('aabc' =~ /a([^a]*?)c/){print $1;} これなら1つ目の「a」ではマッチしませんから、$1 eq 'b' となります。
- ORUKA1951
- ベストアンサー率45% (5062/11036)
あるいは、 $ perl if('aabc'=~/a([^a]*?)c/){print "$1\n";} if('aabc'=~/a([^a]*?)c/){print "$1\n";} 要は if('aabc' =~ /a(.*?)c/){print $1;} だと、aが見つかった時点で.*にマッチするものを探すという事です。当然aは.に含まれますから、期待通りabが出力される。 if('aabcaabbc' =~ /a(.*)c/){print $1;} と if('aabcaabbc' =~ /a(.*?)c/){print $1;} を比較するとよいかな
- ORUKA1951
- ベストアンサー率45% (5062/11036)
- Tacosan
- ベストアンサー率23% (3656/15482)
なるべく文字列の先頭に近い位置でマッチする場合を優先するから.