Perl入門   No.16


4.10 正規表現
 
4.10.1 正規表現
 
 正規表現とは耳慣れない言葉ですが、英語では、「Regular Expression」と言い、訳すと「規則正しい式」という意味になります。文章に含まれる文字列をパターンによって検索や置換をするものと考えておけばよいでしょう。
 例えば、「行く」という言葉を文章中から検索したい場合、「行く」だけでは終止形の「行く」しかヒットしません。しかし「行かない」「行きます」「行けば」「行け」といった言葉もどこにあるか知りたいという場合、「行」だけだと、「銀行」や「行為」といった余計な言葉も引っ張り出されます。そこで活躍するのがこの正規表現です。検索語に行[かきくけ]とすると、「行か(ない)、行き(ます)、行く(とき)、行け(ば)」が検索されてきます。具体的には、
%grep 行[かきくけ] sample.txt (grep という検索ソフトを使った例)
 
とします。
 
パターンマッチ  エディタでの検索、置換と同じ方法
 
上記の正規表現による検索は、文字列から指定した検索語を取り出すという作業をしているわけで、パターンと一致したものを画面に出せと言っているのと同様です。ですからこうした正規表現による検索語にあたるようなものをパターンマッチさせると言います。
 パターンマッチ語でもっともよく使われるものには、
.  何か一文字
*  複数の文字
 
を掲げることが出来ます。これを組み合わせて、.* とすると全ての文字ということになります。昔のMD DOSや、UNIX(Linux)を少し扱った人は、ワイルドカードというものを知っているはずです。例えば、
%ls test.*
 
とすると、test.txtやtest.datやtest.cやらがわらわらと現れるという使い方です。これとよく似ています。
/a./  aで始まる一文字。     abcd abcdef
/a.b/  aで始まりbで終わる3文字  asb azb
/a*b/  aで始まりbで終わる文字  asdfb abcdeb

[0123456789] 数字一文字 [0-9] と同じ
 
例  次のような内容の test.dat をまず作ります。
 
text.dat
道長
信長
秀吉
家康
慶喜
 
test.pl
#!/usr/bin/perl

open(IN,"test.dat");
while(<IN>){
  if(/秀吉/){
   print;
  }
}
close(IN);
 
秀吉が出てくると成功です。これはその行の中に「秀吉」という文字列パターンと一致するものがあるかという意味ですので、/長/とすると、「道長」「信長」の2つが出てくるでしょう。