株式会社エスロジカル
株式会社エスロジカル
セキュリティ、Web開発、Unix開発、Go言語

■ Perl:正規表現における () と (?:) の違い

技術ドキュメント目次 -> Perl -> 正規表現における () と (?:) の違い

本技術ドキュメントは、ここしばらくメンテナンスをしておりません。
内容が古くなっている可能性などございますこと、ご理解を頂けますようお願いいたします。


サイフにやさしいSSL証明書
【低価格SSL証明書】弊社運営の低価格SSL証明書販売サイト、翌月末払いなど請求書払いも可能。


◆ 正規表現における ()

正規表現による操作をPerlで行う際に、
$somevar といった変数値をパターンとして記述することもよくあるかと思います。

また、その際、変数であることを示す $ が正規表現の終端マーク(^ が先端マーク
で $ が終端マーク)とまぎらわしいので、変数値を () でくくってパターンとして
記述することもよくあるかと思います。

その際、()でくくった部分にマッチする文字列は、
$1 $2 といった特殊な変数に値がコピーされています。

例えば次のようなコードがあった場合、

my $str = "Hello World!";
my $reg = "Hello";

if ($str =~ m|^($reg)\s+([a-zA-Z]+)|) {
        print "Match !!\n";
        print "1: $1\n";
        print "2: $2\n";
} else {
        print "NOT Match !!\n";
}


それを実行すると次のようになります。

$ perl test.pl
Match !!
1: Hello
2: World
$


◆ 正規表現における () と (?:) の違い

(?:) は () と同じようなことを行えるのですが、
(?:) の場合は $1 $2 への値のコピーが行われませんので、
その分高速に動作します。

$1 $2 への値のコピーを必要としていないときには、
() でなくて (?:) を使用することをオススメします。

例えば次のようなコードがあった場合、

my $str = "Hello World!";
my $reg = "Hello";

if ($str =~ m|^(?:$reg)\s+([a-zA-Z]+)|) {
        print "Match !!\n";
        print "1: $1\n";
        print "2: $2\n";
} else {
        print "NOT Match !!\n";
}


それを実行すると次のようになります。

$ perl test.pl
Match !!
1: World
2:
$


上記の例では、m|^(?:$reg)\s+([a-zA-Z]+)| としていましたが、
それを、m|^(?:$reg)\s+(?:[a-zA-Z]+)| に代えると、
正規表現実行後に $1 も $2 も値が空になっています。



■ Perl についての他のドキュメント


■ 他のグループのドキュメント

Apache  /  Linux  /  FreeBSD  /  OpenSSL  /  Perl  /  HTTPプロトコル  /  Jakarta Tomcat  /  Java  /  NetBSD  /  Oracle  /  PostgreSQL  /  UNIX の C言語  /  UNIX のコマンド  /  Windows  /  bind  /  システム運用TIPS

アンケートにご協力をお願いいたします。

1. このドキュメントへの評価をご選択ください。
         

2. ご感想をお書きください。