5.1 パターンマッチ

Perlは正規表現と文字列を比較し、結果としてtrue/falseを返します。
正規表現を作成するには、目的の文字パターンを作成し、/(スラッシュ)で囲みます。
ここでは、いろいろな正規表現を用いた文字列の検索手法を学びます。

  正規表現 意味 解説
1文字
マッチ
任意の1文字 /a.b/は"abc","axc"などにマッチ
[  ] どれかの文字 /[abc]/は"a","b","c"のどれかにマッチ  [a-z]小文字のアルファベットのどれかにマッチ
\d 数値 数値にマッチ
\w 単語 単語にマッチ
\D 数値以外 数値以外にマッチ
\W 単語以外 単語以外にマッチ
\s 空白文字 空白文字
\S 空白文字以外 空白文字以外
\a アラーム アラーム・コードにマッチ
\n 改行 改行・コードにマッチ
\r キャリッジリターン キャリッジリターン・コードにマッチ
\t タブ タブ・コードにマッチ
\f 改ページ 改ページ・コードにマッチ
\e エスケープ エスケープ・コードにマッチ
^ 否定 否定にマッチする
^\dは数値以外にマッチ  [^a-z]は小文字のアルファベット以外にマッチ
複数文字
マッチ
* 0個以上の文字列 /a*b/は"aaab","ab","b"にマッチ
+ 1個以上の文字列 /a*b/は"aaab","ab"にマッチ   "b"にはマッチしない
? 1個以下の文字列 /ab?c/は"abc","ac"にだけマッチ
{   } 指定個数の文字列 /ab{1,3}c/は"abc","abbc","abbbc"にマッチ
グループ化 (   ) 記憶 /ab(.)ab\1/は"abcabc"には一致するが"abcabe"にはマッチしない
記憶したいパターンをカッコで囲み、記憶したパターンをマッチさせる場所には\1を記入
\1の数値は、記憶の順番を表す
/ab(.)ab(.)\2ab\1/は"abcabddabc"とマッチする
この場合\1=c  \2=dである
| 選択 /a|f|z/は"a"または"f"または"z"に一致する
パターンアンカー

マッチさせたい
場所の指定
\b 単語境界 /abc\b/は"abc","zabc"にはマッチするが"abcd","abc99"にはマッチしない
\B 単語境界以外 /abc\B/は"abcd","zabcz"にはマッチするが"abc","0abc"にはマッチしない
先頭 /^a/は"a12","axy"にはマッチするが"0abc","cba"にはマッチしない
$ 最後 /a$/は"12a","cba"にはマッチするが"abc","1a1"にはマッチしない
行番号 CGIプログラム 解   説
1 #!/usr/local/bin/perl5 1行目は必ずPerlプログラムのある場所を記入
2 #パターンマッチの使い方 #の右側の文字列はコメント
3 print "Content-type: text/html\n\n"; print文でブラウザへタグ文字列を送っています
4 print "<HTML>\n";
5 print "<HEAD>\n";
6 print "<TITLE>パターンマッチ</TITLE>\n";
7 print "</HEAD>\n";
8 print "<BODY>\n";
9 @num=qw(one 2 three 4 five six seven eight 9 ten); qw演算子を使って配列の初期化
10 @week=qw(sunday monday tuesday wednesday thursday friday saturday); qwを使うと引用符で各要素を囲む必要がなくなる
11 foreach (@num){ foreachでコピーされる変数が指定されていないのでデフォルト変数$_に配列の各要素が格納される(foreach $_ (@num)と同じ)
12     if(//){ $_との比較  if($_=~/e/)と同じ意味
13         print "$_&nbsp;";
14     }
15 }
16 print "<BR>\n";
17 foreach (@num){
18     if(//){
19         print "$_&nbsp;";
20     }
21 }
22 print "<BR>\n";
23 foreach (@num){
24     if(/[]/){
25         print "$_&nbsp;";
26     }
27 }
28 print "<BR>\n";
29 foreach (@week){
30     if(/tu/){
31         print "$_&nbsp;";
32     }
33 }
34 print "<BR>\n";
35 foreach (@num){
36     if(//){
37         print "$_&nbsp;";
38     }
39 }
40 print "</BODY>\n";
41 print "</HTML>\n";

戻る 次へ