株式会社エスロジカル
株式会社エスロジカル
セキュリティプロダクツ提供
Web開発、システム開発、UNIXシステム構築
個人情報保護方針

技術ドキュメント

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

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



[オススメ] 国内最安のSSL証明書(RapidSSL 2880円、ジオトラスト 10500円、ベリサイン 39900円)
[オススメ] SSL証明書のアフィリエイトプログラム(最大11700円/1件の報酬を獲得いただけます)

◆ 正規表現における ()

正規表現による操作を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. ご感想をご自由にお書きください。



自社運営サイト: SSL証明書 / 改ざん検出 / 秘密分散法 / 暗号化ソフト / OpenIDサイト一覧 / IPアドレス表示 / リンク切れチェック / RapidSSL / ジオトラスト / ベリサイン / SSL

Copyright (C) 2006-2008 Slogical Corporation. All Rights Reserved.
ご意見などは、こちらのお問い合わせ用ページ からお願いいたします。

本サイト上の文書で記載または紹介している会社名、商品名は一般に各社の商標または登録商標です。
本サイト上の文書中では、TM マークおよび R マークを明記していない場合があります。