Perlメモ —ざっくり正規表現—

/web/server-side

Note: この記事は、3年以上前に書かれています。Webの進化は速い!情報の正確性は自己責任で判断してください。

読んで字のごとく

主なメタ文字

\直後の文字をエスケープする
.任意の一文字にマッチ(改行を除く)
X | YXまたはYにマッチ
( )グループ化する
[ ]文字クラスを作る
[^ ]否定文字クラスを作る
\w[0-9a-zA-Z_]英数字と_にマッチ
\W[^0-9a-zA-Z_]\w以外の文字にマッチ
\s[ \t\f\r\n]空白文字1文字にマッチ
\S[^ \t\f\r\n]\s以外の1文字にマッチ
\d[0-9]数字の1文字にマッチ
\D[^0-]\d以外の1文字にマッチ

ex. 文字クラス

以下は、全て同じ意味。

  • [0123456789]
  • [0315624798]
  • [0-9]
  • [^\D]
  • [\d]
  • \d

ex. 否定文字クラス

以下は、全て同じ意味。

  • [^0123456789]
  • [^5123067894]
  • [^0-9]
  • [^\d]
  • [\D]
  • \D

ex. メタ文字 "?"

以下は、同じ意味。

  • /archiv?a/
  • /arvhiv{0,1}a/

ex. メタ文字 "|"

  • /this is (red|green|blue)/
○: 以下の文字列にマッチ
  • this is red
  • this is green
  • this is blue
×: 以下の文字列にはマッチしない
  • this isred
  • this is Green
  • this is brue

量指定子

最長マッチ
X*Xの0個以上の繰り返し
X+Xの1個以上の繰り返し
X?Xが0個か1個
X{COUNT}XがちょうどCOUNT個
X{MIN,}Xが少なくともMIN個
X{MIN,MAX}Xが少なくともMIN個、多くともMAX個
最小マッチ
X*?Xの0個以上の繰り返し
X+?Xの1個以上の繰り返し
X??Xが0個か1個
X{COUNT}?XがちょうどCOUNT個
X{MIN,}?Xが少なくともMIN個
X{MIN,MAX}?Xが少なくともMIN個、多くともMAX個
最長マッチ
文字列中でマッチするものの中で最も末尾に近いものにマッチ
最小マッチ
文字列中でマッチするものの中で最も先頭に近いものにマッチ

メタシンボルの一覧

エスケープシーケンス
\tタブ
\n改行
\0null文字
\r復帰
\f改ページ
\aベル(BEL)文字。「\cG」と同じ
\eエスケープ(ESC)文字
\OCT8進数。「\011」または「\11」で「タブ」にマッチ
\xHEX16進数。「\x41」で「A」という文字にマッチ
\cX「\c + X」で、対応する「Ctrl + 文字」にマッチ
テキスト修飾子
\l文字次の文字を小文字に変換
\u文字次の文字を大文字に変換
\L...\E...を小文字に変換
\U...\E...を大文字に変換
\Q...\E...の中のメタ文字をエスケープする
アンカー
^行頭
$行末(終わりが改行なら直前にマッチ)
\b単語境界(\wと\Wの間の位置)にマッチ
\B\b以外にマッチ
\A文字列の最初にマッチ
\Z文字列の最後にマッチ(最後が改行なら、その直前)
\G文字列の先頭、もしくは前回のm//gマッチが終了した場所にマッチ

演算子

m//文字列にマッチ
s///文字列を置換する
tr///置換元の文字リストから置換先の文字リストへの変換を行う

ex. 文字列「http:.//archiva.jp/web/」にマッチ

以下は、全て同じ意味。

  • /http:\/\/archiva\.jp\/web\//
  • m|http://archiva\.jp/web/|
  • m!http://archiva\.jp/web/!
  • m|\Qhttp://archiva.jp/web/\E|

修飾子

/ssingle line文字列を1行として扱う(メタ文字.が改行にもマッチする)
/mmultiple line文字列を複数行として扱う(メタ文字^や$は改行で区切られた行ごとの初めと終わりにマッチする)
/gglobal繰り返しパターンマッチを行う
/iignore大文字小文字の違いを無視する
/eevaluate置換後の文字列をPerlの式として評価する(関数が使える)
/xextend空白やコメントを無視する(スペースを表すには"\ "と記述する)
/ocompile once変数を含んだ正規表現を使うとき、(その変数の内容が変化しないなら)前回の処理内容を再利用する(その結果、高速になることが期待される)

ex. /e

  1. my $str = 'How I wonder what you are.';
  2. $str =~ s/\w+/ucfirst($&)/eg;
  3. print $str;

How I Wonder What You Are.

ex. /x

  1. if($str =~
  2. /( #1つめのカッコ。$1に設定される
  3. ( #2つめ。$2に設定される
  4. \d # 数字にマッチ
  5. +
  6. )
  7. ( #3つめ。$3に設定される
  8. yen
  9. )
  10. )/x
  11. ){
  12. ...goodness...
  13. }

置換演算子

s/置換前/置換後/
\e式の右側の評価を行なう
\ee式の右側の評価を行い、実行後の戻り値を再度評価する
\g繰り返し置換
\i大文字、小文字を区別しないで検索
\m文字列を複数行として扱う
\oパターンの評価を 1 度だけにする
\sワイルドカードのドット( . )が改行にもマッチするようにする
\x拡張正規表現を使用する
tr/置換元の文字リスト/置換先の文字リスト/オプション
/c置換元の文字セットを反転させる
/d置換元にあるが、置換先に対応する文字が無ければ削除する
/s置換した文字が連続したら1つにまとめる
/UUTF-8として扱う
/C8ビット文字として扱う

ex. tr/演算子

大文字の数を数える
my $count = ($str =~ tr/A-Z/A-Z/)
小文字を削除する
$str =~ tr/a-z//d;
英数字以外を1個のスペースに置換する
$str =~ tr/A-Za-z0-9/ /cs;
$nameを$unameに代入。$unameだけを全て大文字にする
(my $uname = $name) =~ tr/a-z/A-Z/

特殊変数

$&マッチした範囲を取り出す

ex. 数字だけ抜き出す

  1. my $str = 'this is 500yen'
  2. if($str =~ /\d+/){
  3. print '$& is the number.'
  4. }

500 is the number.

ex. マッチした文字列を使って置換

  1. my $str = 'How I wonder what you are.';
  2. $str =~ s/how|who|what/$& $& $&/gi;
  3. print $str;

How How How I wonder what what what you are.

後方参照

$n
  • n番目のカッコにマッチした文字列
  • パターンマッチの後で使用する
\n
  • n番目のカッコにマッチした文字列
  • パターンマッチの中で使用する

ex. $n

  1. my $str = '122,145,468'
  2. if($str =~ /(\d+),(\d+),(\d+)/){
  3. my $num1 = $1;
  4. my $num2 = $2;
  5. my $num3 = $3;
  6. }
  • $1 → 122
  • $2 → 145
  • $3 → 468

ex. \n

子音1個の後に母音2個
/[bcdfghjklmnpqrstvwxyz][aiueo][aiueo]/
子音1個の後に"同じ"母音2個
/[bcdfghjklmnpqrstvwxyz]([aiueo])\1/

参照

Note: スパム対策が面倒なので、コメント投稿を廃止しました。以前のコメントは残します。
ご意見・ご要望はtwitter@sigwygかはてブコメントにて。