テキスト処理に長けたPerlの真骨頂「正規表現」を具体例とともに書いていきます。



■簡単な用語


「デリミタ」
「パターンマッチ」は/match/ のように「/」で始まり「/」で閉じます。
このときの「/」を「デリミタ」と言います。

「デリミタ」は別のものに代えることができます。そのためには
m#match# のように頭に「m」を持ってきて「#」のような換えたい文字で始めと終わりをくくります。
ファイルパスなど「/」を含む文字のマッチングなどではよく代替デリミタが使われます。



「修飾子」
「修飾子」(オプションとも呼ばれる)を使ってマッチのときの規則を指定することができます。
/match/i のように「デリミタ」で閉じた直後に付加する方法で指定します。
「i修飾子」を使った上記例では「match」だけでなく「Match」も「mAtCh」もマッチさせるようになります。


■単純なマッチ


["abc"にマッチ]
/abc/



["abc"や"ABC"など大小文字関係なくマッチ]
/abc/i や /ABC/i または /Abc/i など・・



["abc"または"xyz"にマッチ]
/abc|xyz/


「|(パイプ)」を使うと複数文字列のマッチを書くことができます。



["abc"または"Abc"にマッチ]
/[aA]bc/


マッチさせる文字が互いに一箇所違う場合は[]を使って指定できます。



["a"または"b"にマッチ]
/[ab]/ または /a|b/



["a"または"b"または"c"にマッチ]
/[abc]/ または /a|b|c/ または /[a-c]/



["a"から"z"までのどれかにマッチ]
/[a-z]/



["a"から"z"以外のすべての文字にマッチ]

/[^a-z]/



[アルファベットまたは数字にマッチ]
/[a-zA-Z0-9]/ または /a-z0-9/i



[文字列の先頭が"abc"で始まっていればマッチ]
/^abc/



[末尾が"abc"ならマッチ]
/abc$/



[先頭が"abc"または"xyz"ならマッチ]
/^(abc|xyz)/



[先頭から末尾までが"abc"または"xyz"ならマッチ]
/^(abc|xyz)$/



[空文字列にマッチ]
/^$/



["abc"の出現部分すべてに繰り返しマッチ]
/abc/g


「g修飾子」を使うと繰り返しマッチ



["aaa"にマッチ]
/aaa/ または /a{3}/



["a"が0回または1回にマッチ]
/a?/



["jpeg"または"jpg"にマッチ]
/jpe?g/



["a"が0回以上、連続するだけマッチ]
/a*/



["a"が1回以上、連続するだけマッチ]
/a+/



["a"が5回以上連続にマッチ]
/a{5,}/



["a"が5回以上、10回以下連続にマッチ]
/a{5,10}/



["abc"が5回以上、10回以下連続にマッチ]
/(abc){5,10}/



と、ここまでは正規表現を一切使わないごく単純なパターンマッチでした。


一旦整理します。
まず最初に「どんな文字」がくるかを指定します。
それが単独文字の集合なら[ ]でまとめて、文字列なら( )でまとめます。
指定文字が連続するパターンならその量を指定します。


"aaa"のように"a"が3連続なら、/a{3}/(まずa文字を指定して、これが3連続であることを表す{3}が続く)


不特定のアルファベットが3連続なら、/[a-zA-Z]{3}/ や 修飾子を使って /[a-z]{3}/i のようになる。
アルファベット文字の集合を[ ]で範囲指定し、これが3連続続くので{3}と書けばいい。
範囲指定しないでaからzまで書き連ねても同様になるが、冗長になってしまう。
[abcdefghijklmnopqrstuvwxyz] (長すぎる)
[a-z] スッキリまとまる
[a-gh-no-uv-xyz] (この書き方は無理がある)


"abcabcabc"のように"abc"が3連続なら、/abc{3}/ と書いてしまうとab後にcが3連続のパターンを意味するのでここは( )でまとめて /(abc){3}/ と書く。


"abc"か"xyz"の3連続なら /(abc|xyz){3}/ のように書くことができる。



[マッチ位置]

先頭マッチ --- /^abc/
部分マッチ --- /abc/
終端マッチ --- /abc$/

[文字のまとめ]

単独文字の集合 --- /[aA]/

単独文字の集合(除外) --- /[^aA]/
文字列の複数パターン --- /(abc|xyz)/


[連続する量]
0または1 --- /a?/ /(abc)?/
0以上 --- /a*/ /(abc)*/
1以上 --- /a+/ /(abc)+/
m以上 --- /a{m,}/ /(abc){m,}/
m回 --- /a{m}/ /(abc){m}/
m以上n以下 --- /a{m,n}/ /(abc){m,n}/

[修飾子]
大小文字両方 --- /a/i (/[aA]/と同じ)
繰り返しマッチ --- /a/g (aの出現回数繰り返す)


次はいよいよ正規表現を使っていきます。