テキスト処理に長けたPerlの真骨頂「正規表現」を具体例とともに書いていきます。
■簡単な用語
「デリミタ」
このときの「/」を「デリミタ」と言います。
「デリミタ」は別のものに代えることができます。そのためには
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$/
[文字のまとめ]
単独文字の集合 --- /[aA]/
単独文字の集合(除外) --- /[^aA]/
文字列の複数パターン --- /(abc|xyz)/
[連続する量]
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/g (aの出現回数繰り返す)
次はいよいよ正規表現を使っていきます。