CGI WEB [ CGI配布 CGI解説 ホームページ作成支援 ]
ホーム|CGI配布|CGIランキング|CGIサポート|CGI解説|ワンタッチボード|ワンタッチメール|クイズ|自宅サーバ|サーバガイド|登録太郎|CGI WEBサーチ|CGI WEB窓口


back
正規表現





正規表現で使われるメタ文字について説明します。

■メタ文字

^   先頭を意味します。
    /^yes/ "yesterday"にマッチ "say yes"にアンマッチ

$   末尾を意味します。
    /yes$/ "say yes"にマッチ "yesterday"にアンマッチ

\   直後のメタ文字の機能を抑止します。
    /yes\$/ "yes$"にマッチ "say yes"にアンマッチ

.   任意の1文字にマッチします。
    スペースにもマッチしますが改行にはアンマッチです。
    /c.t/ "wild cats"にマッチ "ct"にアンマッチ

()   グループ化を行います。
    /(rm)?dir/ "rmdir" "dir" "AdirB"にマッチ

|   |の前後に指定したパターンのいずれかを表します。
    /(red|blue|green)/ "green tea"にマッチ

[]   [と]の中に指定した文字群のうちの1文字を表します。
    /point[01234]/ "point2"にマッチ "2points"にアンマッチ

-   [と]の中で使われる文字の範囲指定を行います。
    /point[a-zA-Z]/ "2points"にマッチ "point2"にアンマッチ

[^]  [^と]の中に指定した文字群以外の1文字を表します。
    /point[^0-9]/ "2points"にマッチ "point2"にアンマッチ

*   直前のパターンの0回以上の繰り返しにマッチします。
    /go*d/ "AgdB" "AgodB" "AgoodB"にマッチ

+   直前のパターンの1回以上の繰り返しにマッチします。
    /(ya)*(hoo)+/ "hoohoo" "yayahoooo"にマッチ

?   直前のパターンの0回又は1回の登場にマッチします。
    /colou?r/ "colour" "color"にマッチ

{n,m} 直前のパターンのn回以上m回以下の繰り返しにマッチします。

{n,}  直前のパターンのn回以上の繰り返しにマッチします。

{n}  直前のパターンのn回の繰り返しにマッチします。

\d   1桁の半角数字にマッチします。
    /[0-9]/と等価です。

\D   1桁の半角数字以外にマッチします。
    /[^0-9]/と等価です。

\w   半角英数字と_(アンダースコア)1文字にマッチします。
    /[a-zA-Z0-9_]/と等価です。

\W   半角英数字と_(アンダースコア)以外の1文字にマッチします。
    /[^a-zA-Z0-9_]/と等価です。

\s   空白を表す1文字にマッチします。
    /[\t\n\r\f]/と等価です。

\S   空白を表す文字以外の1文字にマッチします。
    /[^\t\n\r\f]/と等価です。

\t   タブコードにマッチします。

\n   LF(ラインフィード)にマッチします。

\r   CR(キャッジリターン)にマッチします。

\f   改ページにマッチします。

\0   ヌルコードにマッチします。

メタ文字を使用した正規表現は色々な関数で利用する事が出来ます。 以下に簡単な例を挙げます。

■条件判断で利用する

if ($str =~ /\D/) { print '数字以外の文字が含まれています。'; }

正規表現を使って条件判断をするには[==]や[eq]ではなく[=~]を使用します。 $strに半角数字以外の文字が含まれている場合に真となります。

if ($email !~ /^.+\@.+\..+$/) { print 'Eメールの書式ではありません。'; }

[!=]や[ne]ではなく[!~]を使用します。 $emailがEメールの書式ではない場合に真となります。

■s///(置換演算子)で利用する
はじめのスラッシュ間のパターンにマッチするものを次のスラッシュ間のパターンに置換します。

$str =~ s/\r\n//g;

\r\n(Windows既定の改行コード)を消去します。 修飾子gを付けていますので$strの全ての\r\nを消去する事になります。

$str =~ s/\.jp/\.com/i;

.(ドット)はメタ文字ですので.(ドット)という文字にマッチさせる為に\を付けて、メタ文字である.(ドット)の機能を抑止しています。 修飾子iを付けていますので大文字や小文字を問わずマッチさせますので「.jp」「.Jp」「.jP」「.JP」のいずれかを「.com」に置換します。 修飾子gを付けていませんので最初にマッチしたものだけを置換します。 例えば$strが「.JP.jp」だとすると置換処理後は「.com.jp」となります。

■tr///(変換演算子)で利用する
はじめのスラッシュ間のパターンに対応するものを次のスラッシュ間のパターンに変換します。

$str = 'ワレワレハ宇宙人ダ。';
$str =~ tr/ァ-ン/ぁ-ん/;

$strの全てのカタカナをひらがなに変換しています。 変換後の$strは「われわれは宇宙人だ。」となります。 この処理をs///(置換演算子)で行うとうまくいきません。 違いをよく理解しておいて下さい。 tr///(変換演算子)の場合は修飾子gをつけなくても全域の変換を行います。

■少し高度な正規表現の利用方法

□$lineに含まれる全ての数字列を抽出して@newを作る

$line = '1枚300円の宝くじを100枚買った。';
@new = ($line =~ /\d+/g);

配列@newは(1, 300, 100)となります。

□マッチした範囲の取り出し1

$str = 'My Z is 200ZR.';
if ($str =~ /\d+/) { print $&; }

マッチした範囲は特殊変数$&に格納されます。 ここでは数字列にマッチさせていますので「200」と表示されます。

□マッチした範囲の取り出し2

$ip = '192.168.1.10';
if ($ip =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/) {
  ($one, $two, $three, $four) = ($1, $2, $3, $4);
}

グループ化を行う()内の正規表現にマッチした範囲は特殊変数$1から順に格納されます。 ここでは192が$1に、168が$2に、1が$3に、10が$4に格納されます。

□マッチした範囲の取り出し3

$text = 'I see you';
$text =~ s/(\w+) *(\w+) *(\w+)/$3 $2 $1/;
print $text;

はじめのスラッシュ間のパターンにマッチした範囲を次のスラッシュ間で利用する事が出来ます。 「you see I」と表示されます。

□後方参照

if ($text =~ /<(font|span)>.*<\/\1>/i) {
  print 'font又はspanタグを検出しました。';
}

マッチした範囲を同じパターン内で参照するには$1からの特殊変数ではなく\1からの特殊変数を使用します。 これを後方参照といいます。



□更新履歴
 2007.04.28 全体的に内容を見直し




CGI WEB