技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

perl の正規表現の最小マッチ

perl で、文字列の前後のスペースをトリムする時は、正規表現を利用して、

$str =~ s/^\s*(.*?)\s*$/$1/;

というコードを書く。

上記の (.*?) の中の「?」が何のために必要なのか、よく忘れてしまうので、ここにメモしておく。

結論から言うと、perl正規表現のマッチはデフォルトでは最長マッチなので、
ここでの用途に合わせて最短マッチにするために「?」は必要になるということ。


簡単な例で見ていこう。

my $str = '   abc   ';
$str =~ s/^\s*(.*)\s*$/$1/;
print $str;

上記のコードの出力は、「abc△△△」(△はスペース) となり、後ろ部分のスペースがトリムできていない。
これは、上述の通り、perl正規表現はデフォルトでは最長マッチなので、(.*) が後ろ部分のスペースまで含んでしまうためである。

そこで、「?」の出番である。以下のように「?」を付与すると、最小マッチになり、
.*? がマッチするのは、「abc」だけになる。

my $str = '   abc   ';
$str =~ s/^\s*(.*?)\s*$/$1/;
print $str;

上記のコードの出力は「abc」となり、意図通り、前後のスペースがトリムされている。