ためになるホームページ お問い合わせ




TOP > Perl > 正規表現
正規表現とは?
文字列に対してマッチさせられるテンプレートの事をいう。
パターンを/と/の間に記述する。但しこれは、ショートカットであり、実際は、「m//」である。
qwショートカットと一緒でデリミタは変更する事ができる。(スラッシュの時のみmを省略できる)
ちなみにパターンを変数に指定する事もできる。この際、展開される変数に注意する必要がある。

簡単な正規表現の例
$_= "abcdefg";
if (/cde/)
{
  print "cdeにマッチしました\n";
}


メタキャラクタ(.)
改行文字を除いたあらゆる文字の1文字に一致。

メタキャラクタの例
$_= "abcdefg";
if (/c.e/) 
{
  print "match\n";
}


量指定子
「*」(アスタリスク)・・・直前の文字に0文字以上、マッチする。
「+」(プラス)・・・直前に置かれたものに1回以上マッチする。
「?」(クエスチョン)・・・直前に置かれたものが一回現れるか、もしくは現れないか。+を限定したもの。

量指定子の例
$_= "abcdefg";
#ガラクタ。任意の1文字が連続で0回以上マッチする
if (/c.*e/) 
{
  print "match\n";
}
if (/ab*d/)
{
  print "match\n";
}

#+の使い方
$_ = "abcdef";
if (/ab+c/)
{
  print "match\n";
}
$_ = "aabbbcc";
if (/a+b+c+/)
{
  print "match\n";
}

#?の使い方
$_ = "abcdef";
if (/a?bc/)
{
  print "match\n";
}
$_ = "aa-ccc";
if (/aa?cc/)
{
  print "match\n";
}


繰り返し回数を指定するには、以下の書式を使う。
c{a,b} cがa以上b以下の出現でマッチ
c{a,} cがa以上の出現でマッチ
c{a} cがa回の出現でマッチ

パターンのグループ化
括弧でくくる事により、グループ化できる。

パターンのグループ化の例
$_ = "abc" x 3;
if (/(abc)+/)
{
  print "match\n";
}


選択肢
「ある文字とある文字のどちらか」という時には、「|」を使う。「|」の左右の文字のどちらかにヒットした際にマッチした事になる。

選択肢の例
$_ = "abcdef";
if (/ab(z|c)de/)
{
  print "match\n";
}


文字クラス
文字クラスは、1対のブラケット([])の間に文字を並べたもので、その中のどれか1文字にマッチする。

文字クラスの例
$_ = "abc2def";
if (/abc[0-9]def/)
{
  print "match\n";
}
#その他の例
#[^abc]   #先頭にキャレット(^)を置くと否定となり、a,b,cでない時となる。
#[0-9]    #-で文字範囲指定0から9まで
#[a-z]    #aからzまで
#[0-9a-z] #0-9,a-zまで
#[0-9\-]  #0-9,-


上記のような記述を簡略化するために、perlではショートカットが用意されている。
\d は[0-9]のこと
\w は[0-9a-zA-z_]のこと
\s は[\f\t\n\r ]のこと(改ページ・タブ・改行文字・復帰文字・スペース)
\W は[^\w] のこと (ワード以外の文字)
\D は[^\d] のこと (数字以外の文字)
\S は[^\s] のこと(空白以外の文字)

文字クラスのショートカットの例
$_ = "aabb\t99\n";
if (/\w+\s\d+\d\D/)
{
  print "match\n";
}
#[\d\D]は、すべてにマッチする。


アンカー
キャレットアンカー(^)は、文字列の先頭を表し、ドルアンカー($)は、文字列の末尾を表す。

ワードアンカー
\bではさんだパターンにマッチする。

ワードアンカーの例
$_ = "abcdef";
if (/\babc\b/)
{
  print "match\n";
}
else
{
  print "no match\n";
}
$_ = "abc def ghi";
if(/\bdef\b/)
{
  print "match";
}


非ワードアンカーもあり、「ワードアンカーにマッチしない全て」である。

非ワードアンカーの例
$_ = "aabbcc";
#先頭にワードアンカーがあるので、
#aabbccには最低マッチする必要がある。
#かつ、非ワードアンカーがるので、ccの後ろに何かしらの文字が必要。
if (/\baabbcc\B)
{
  print "no match\n";
}


かっこで記憶させる
括弧で囲んだパターンを記憶させる事ができる(メモリ変数に記憶する)。記憶する括弧の個数分、$nがある。

かっこで記憶させる例
$_ = "abc\tdef\tghi";
if (/(\S+)\s*(\S+)\s*(\S)\s*/)
{
  print $1 . $2 . $3;
}


後方参照
パターン内でそれまでにマッチした文字列とまったく同じ文字列にマッチさせたい時に使う。
括弧でパターンを記憶させ、その値をパターン内に埋め込む。\1は、最初に括弧でくくった値を参照する。以下\2...と続く。

後方参照の例
$_ = "<a href= \"./top.html\">";
if (/<a href\s*=(['"]).*\1>/) #ここでの\1は、['"]の事
{
  print "match\n";
}


優先順位
1位:括弧
2位:量指定子 * + ? {}
3位:アンカー ^ $ \b \B
4位:選択 |

オプション修飾子
/i 大文字と小文字を区別しないで、マッチさせる。
/s .を改行文字にもマッチさせる。

オプション修飾子の例
#オプション/iの例
$_ = "abcDefg";
if (/\babcdefg\b\i/)
{
  print "match\n";
}
#オプション/sの例
(例)
$_ = "abcdefg\nghi\n";
if (/abcdefg.*i/s)
{
  print "match";
}


結合演算子
パターンにマッチさせる時、デフォルトでは$_が使われるが任意に指定する事ができる。
(書式)$変数 =~ パターン

結合演算子の例
$val = "abcdefg";
if ($val =~ /abc/)
{
  print "match\n";
}


自動変数
perlでは、以下の自動変数が用意されているが、使用すると処理速度が遅くなる事がある。
$&・・・マッチした部分全体が格納されている
$`・・・マッチした部分より前が格納されている
$'・・・マッチした部分より後ろが格納されている

置換
s///を使って置換ができる。
(書式)s/A/B/ AをBに置き換える

置換の例
$rep = "abc";
$prev = "def";
$str = "defghi";
if ($str =~ s/($prev)/($rep)/)
{
  print $str;
}


以下のようなオプションもある。
s/^\s+//;#先頭の空白を取り除く
s/\s+$//;#末尾の空白を取り除く
上記の置換では、一回のみ実行される。/gオプションをつけると、全てが対象となる。
また、置換でもデリミタを変更する事ができる。

デリミタを変更してみる例
s{aaa}{/bbb/}
s#/gggg/#


置換には以下のオプションがある。
\U 後ろに続く文字を大文字にする。
\L 後ろに続く文字を小文字にする。
\E 途中でとめる。
\u,\l 次の一文字だけ大文字・小文字にする

オプションの例
s/(aaa|bbb)/\U$1/gi
s/(AAA) (BBB)/\L$2\E $1/gi
s/(aaa|bbb)/\u\L$1/ig;


split演算子
指定したセパレータで区切り、区切られた値をリストとして返す。パターンにマッチする部分は、返されない。

split演算子の例
@filed = split /セパレータ/, $str;
#デリミタが2個以上ある場合は、空文字が返される。
$str = "aaa#BBB##ccc";
@field = split /#/, $str;   # "aaa" "BBB" "" "ccc"の4つ
#先頭の空フィールドは返されるが、末尾の空フィールドは捨てられる
$str = "###aaa#bbb######";
@field = split /#/, $str;   # "" "" "aaa" "BBB"となる
#デフォルトでは、$_に働き空白文字で区切る
@field = split;


join関数
文字列同士を指定する文字列で繋げる。パターンではなく文字列である事に注意。
(書式) join 結合に使う文字列, 文字列(リスト・配列)

joinの例
$str = join ":" (1..10);







Copyright 2007 ためになるホームページ All Rights Reserved.