アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のコードを実行すると ab が出力されますが理由が分かりません。

if('aabc' =~ /a(.*?)c/){print $1;}

$1の部分は最短マッチなので期待値としては b が帰ってくるべきだと思うのですが、
何故このようなことになるのでしょう。(最短マッチは後方のみ有効?)

暇な方よろしくお願いします。

A 回答 (4件)

他の方も言われていますが、正規表現で文字列を探索するときは、


先頭から行なってマッチした時点で結果を返します。

文字列が'aabc' の場合、まずの1つ目の「a」でマッチするかどうかチェックします。
a ab c ( $1 eq 'ab' )でマッチするのでこれで打ち切りです。
確かに2つ目の「a」でもマッチしますが、そこまでチェックされません。

なので、「最短マッチは後方のみ有効?」ということになります。

ちなみに、期待されている動作にしたい場合は下記のように書く必要があるでしょう。

if('aabc' =~ /a([^a]*?)c/){print $1;}

これなら1つ目の「a」ではマッチしませんから、$1 eq 'b' となります。
    • good
    • 0

あるいは、


$ 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;}
を比較するとよいかな
    • good
    • 0

私のperlはbが出力されますが?ただし、


if('aabc' =~ /a(.*?)c/){print $1;}
じゃだめ。aがひとつと決めているから
「perl 最短マッチについて」の回答画像2
    • good
    • 0

なるべく文字列の先頭に近い位置でマッチする場合を優先するから.

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!