正規表現とは
正規表現( regular expression )は、ある種の記号を組み合わせて、目的のキーワードをパターンとして表現する事です。例えば、「サーバー?サイド」は「サーバーサイド」か「サーバサイド」に、「Windows\s*XP」は、「Windows XP」か「WindowsXP」にマッチします。正規表現を使うと、次の事ができます。
- 文字列がパターンに一致するか検証する
- パターンに一致する部分文字列を抜き出す
- パターンに一致する部分文字列を置換する
ほとんどのプログラミング言語で、構文またはライブラリによって正規表現を使うことができます。もちろん、PHP や JavaScript で利用できます。 正規表現を使う事により、スクリプトでできることの可能性がかなり広がります。
正規表現の例
正規表現は、スラッシュ '/' などのデリミタで囲う必要があります。デリミタとしては、英数字およびバックスラッシュ '\' 以外のすべての文字を使用可能です。デリミタ文字を正規表現本体において使用するる場合は、バックスラッシュでエスケープします。
- /<\/\w+>/ </ と > の中に単語構成文字があるパターンにマッチ
- @^(?i)php[34]@ 行の最初にある php3 pHP3 や PHP4 Php4 にマッチ
- {^\s+(\s+)?$} 1個以上のスペースだけの行にマッチ
メタ文字
メタ文字( meta-character )は、その文字自身を表すのではなく、正規表現のパターンの選択肢や繰り返しを記述できます。メタ文字には、2 種類あり、角カッコ内を除き、パターン中のどこででも使用できる文字と、角カッコで括られた中でだけ使用できる文字です。角カッコで括まれた部分は「文字クラス」と言い、角カッコ内に記述されたどの文字にマッチしても良いことを表します。
メタ文字については、色々な参考書やサイトで紹介されていますので、ここでは意味が複数あり、理解し辛いメタ文字のみ紹介します。
- \
バックスラッシュ '\' をつけると定義された文字に対して特殊文字と解釈されます。例とえば、/b/ は 'b' という文字にマッチしますが、/\b/ は、単語の区切りにマッチすることを意味する特殊文字になります。
また、メタ文字などの通常は特殊文字として使う文字を文字どおりに解釈します。例えば /a*/ は a の 0 文字以上の a へのマッチを意味しますが、/a\*/ は 'a*' にマッチします。 - ?
直前の文字の 0 回か 1 回の繰り返しにマッチするほかに、 *、+、?、{} といった量指定子の直後に使用した場合、その量指定子をスキップ優先(最小回数にマッチ)にします。これはデフォルトとは逆です。デフォルトは繰り返し優先(最大回数にマッチ)です。例えば、/\d+/ は "123abc" の "123" にマッチしますが、/\d+?/ の場合、"1" だけにマッチします。
また先読み表現内でも使用でき、x(?=y) は 'x' に 'y' が続く場合のみ、x(?!y) は 'x' に 'y' が続かない場合のみ 'x' にマッチします。
サブパターン
サブパターンは、'(' と ')' に囲まれた部分です。パターン全体としてマッチに成功した場合、サブパターンにマッチした部分の値はキャプチャされます。 開きカッコ '(' の数が 1 から始まって左から右に数えられ、 キャプチャ用サブパターン (capturing subpattern) の番号が指定されます。
例えば、/a(b)c/ は 'abc' という文字列にマッチし、'b' がキャプチャされます。このカッコで囲まれた部分文字列のマッチは、配列の要素 [1], ..., [n] ( $1, ...,$n )を使用して呼び戻すことができます。これは、PHP でも JavaScript でも共通です。さらに、PHP では $0 は パターン全体にマッチしたテキストを参照できます。
括弧で囲まれた部分文字列は、JavaScript の場合何個でも使用できます。PHP では、99 個までです。返された配列にはその見つかったものすべてが存在します。
次に、JavaScript でサブパターンを使った例を示します。
bsc_rglr.js ソースコード
//正規表現の例
rglr = /(\w+)\s(\w+)/;
str = "Taro Tokoton";
change = str.replace(rglr, "$1 $2 を入れ替えると $2 $1 です。");
document.write(change);
</script>
上記のソースコードの実行結果は、次の通りです。
bsc_rglr.js の実行結果
正規表現の関数
PHP
PHP には、次の関数があります。
- preg_grep — パターンにマッチする配列の要素を返す
- preg_last_error — 直近の PCRE 正規表現処理のエラーコードを返す
- preg_match_all — 繰り返し正規表現検索を行う
- preg_match — 正規表現によるマッチングを行う
- preg_quote — 正規表現文字をクオートする
- preg_replace_callback — 正規表現検索を行い、コールバック関数を使用して置換を行う
- preg_replace — 正規表現検索および置換を行う
- preg_split — 正規表現で文字列を分割する
JavaScript
JavaScript には、RegExp の test および exec メソッド、String の match、replace、search および split のメソッドがあります。
RegExp のメソッドは次の通りです。
- exec — マッチの検索を行う
- test — マッチのテストをする
JavaScript の String のメソッドは次の通りです。
- match — マッチの検索を行う
- search — マッチのテストをする
- replace — マッチした部分文字列を別の部分文字列に置換する
- split — 正規表現を用いて文字列を分割する
正規表現のマニュアル
PHP と JavaScript 用、正規表現の詳細マニュアルは、次が参考になります。
