Note: この記事は、3年以上前に書かれています。Webの進化は速い!情報の正確性は自己責任で判断してください。
読んで字のごとく
主なメタ文字
\ | 直後の文字をエスケープする |
. | 任意の一文字にマッチ(改行を除く) |
X | Y | Xまたは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文字にマッチ |
以下は、全て同じ意味。
[0123456789]
[0315624798]
[0-9]
[^\D]
[\d]
\d
以下は、全て同じ意味。
[^0123456789]
[^5123067894]
[^0-9]
[^\d]
[\D]
\D
以下は、同じ意味。
/archiv?a/
/arvhiv{0,1}a/
/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 | 改行 |
\0 | null文字 |
\r | 復帰 |
\f | 改ページ |
\a | ベル(BEL)文字。「\cG」と同じ |
\e | エスケープ(ESC)文字 |
\OCT | 8進数。「\011」または「\11」で「タブ」にマッチ |
\xHEX | 16進数。「\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/// | 置換元の文字リストから置換先の文字リストへの変換を行う |
以下は、全て同じ意味。
/http:\/\/archiva\.jp\/web\//
m|http://archiva\.jp/web/|
m!http://archiva\.jp/web/!
m|\Qhttp://archiva.jp/web/\E|
修飾子
/s | single line | 文字列を1行として扱う(メタ文字.が改行にもマッチする) |
/m | multiple line | 文字列を複数行として扱う(メタ文字^や$は改行で区切られた行ごとの初めと終わりにマッチする) |
/g | global | 繰り返しパターンマッチを行う |
/i | ignore | 大文字小文字の違いを無視する |
/e | evaluate | 置換後の文字列をPerlの式として評価する(関数が使える) |
/x | extend | 空白やコメントを無視する(スペースを表すには"\ "と記述する) |
/o | compile once | 変数を含んだ正規表現を使うとき、(その変数の内容が変化しないなら)前回の処理内容を再利用する(その結果、高速になることが期待される) |
my $str = 'How I wonder what you are.';
$str =~ s/\w+/ucfirst($&)/eg;
print $str;
→ How I Wonder What You Are.
if($str =~
/( #1つめのカッコ。$1に設定される
( #2つめ。$2に設定される
\d # 数字にマッチ
+
)
( #3つめ。$3に設定される
yen
)
)/x
){
...goodness...
}
置換演算子
s/置換前/置換後/
\e | 式の右側の評価を行なう |
\ee | 式の右側の評価を行い、実行後の戻り値を再度評価する |
\g | 繰り返し置換 |
\i | 大文字、小文字を区別しないで検索 |
\m | 文字列を複数行として扱う |
\o | パターンの評価を 1 度だけにする |
\s | ワイルドカードのドット( . )が改行にもマッチするようにする |
\x | 拡張正規表現を使用する |
tr/置換元の文字リスト/置換先の文字リスト/オプション
/c | 置換元の文字セットを反転させる |
/d | 置換元にあるが、置換先に対応する文字が無ければ削除する |
/s | 置換した文字が連続したら1つにまとめる |
/U | UTF-8として扱う |
/C | 8ビット文字として扱う |
- 大文字の数を数える
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/
特殊変数
my $str = 'this is 500yen'
if($str =~ /\d+/){
print '$& is the number.'
}
→ 500 is the number.
my $str = 'How I wonder what you are.';
$str =~ s/how|who|what/$& $& $&/gi;
print $str;
→ How How How I wonder what what what you are.
後方参照
$n |
- n番目のカッコにマッチした文字列
- パターンマッチの後で使用する
|
\n |
- n番目のカッコにマッチした文字列
- パターンマッチの中で使用する
|
my $str = '122,145,468'
if($str =~ /(\d+),(\d+),(\d+)/){
my $num1 = $1;
my $num2 = $2;
my $num3 = $3;
}
- $1 → 122
- $2 → 145
- $3 → 468
- 子音1個の後に母音2個
/[bcdfghjklmnpqrstvwxyz][aiueo][aiueo]/
- 子音1個の後に"同じ"母音2個
/[bcdfghjklmnpqrstvwxyz]([aiueo])\1/
参照
Note: スパム対策が面倒なので、コメント投稿を廃止しました。以前のコメントは残します。
ご意見・ご要望はtwitter@sigwygかはてブコメントにて。