概要
このページは正規表現に関するまとめページである。
正規表現の本
- [1] 佐藤竜一 : 正規表現辞典 改訂新版
- [2] Jan Goyvaerts、Steven Levithan : 正規表現クックブック
- [3] Jeffrey E. F. Friedl:詳説 正規表現
- [4] Tonny Stubblebine:正規表現 デスクトップリファレンス
- [5] ハーシー:正規表現 ケーススタディブック
- [6] 岩谷宏:入門 正規表現
正規表現が使われる場面
正規表現は、特定の処理系(コマンドやアプリケーション、コンピュータ言語、ライブラリなど)で、 文字列の照合(マッチング)や取り出し(キャプチャ)などを簡潔な記法で表現するための記法である。 正規表現はまた、文字列の置換でもよく使われる。
正規表現を扱う本の対象範囲
| 処理系 | 文献 | 備考 |
|---|---|---|
| egrep | [1], [3], [4], [5] | |
| sed | [1], [4] | |
| awk | [1], [4] | |
| vim | [1], [4] | |
| Perl | [1], [2], [3], [4], [5] | |
| PHP | [1], [2], [4], [5] | [2] では PCRE として解説されている |
| .NET(C# など) | [1], [2], [3], [4] | |
| Java | [1], [2], [3], [4], [5] | |
| JavaScript | [1], [2], [4], [5] | |
| Python | [1], [2], [4] | |
| Ruby | [2] | |
| C | [4] | |
| 秀丸エディタ | [5] |
そのほか、現代のコンピュータ言語であれば普通正規表現は使える。古典的な言語でも、 適切なライブラリ・モジュールを入れれば正規表現は使えると思う( COBOL はわからない)。
文字クラスエスケープ
多くの処理系で、逆スラッシュ + 1 文字で特定の文字集合を表すメタ文字の総称。アンカーの一部も逆スラッシュ + 1 文字で構成されるものがあるが、 混同しないこと。次の例がある。
- \d, \D
数字にマッチ / 数字以外の任意の一字にマッチ。d は digit として覚えるといい。
- \s, \S
空白にマッチ / 空白以外の任意の一字にマッチ。空白とは、スペース 0x20 だけでなく、タブや改行、フォームフィード、復帰も含まれる。 処理系によっては、他の文字も空白に含まれることがある。 s は space として覚えるといい。
- \w, \W
単語構成文字にマッチ / 単語構成文字以外の任意の一字にマッチ。単語構成文字とは通常、英数字とアンダースコアから構成される。 処理系によっては、他の文字も単語構成文字に含まれることがある。w は word として覚えるといい。
- \v, \V
垂直方向空白にマッチ / 垂直方向空白以外の任意の文字にマッチ。垂直方向空白とは垂直タブ 0x0b を表す。 処理系によっては他の文字も垂直方向空白文字に含まれることがある。v は vertical として覚えるといい。
- \h, \H
水平方向空白にマッチ / 水平方向空白以外の任意の文字にマッチ。水平方向空白とは水平タブ 0x09 とスペース 0x20 を表す。 h は horizontal として覚えるといい。
アンカー
アンカー(anchor)とは「錨」の意味である。正規表現がマッチする位置を特定の場所に固定するために用いるメタ文字のことをいう。 アンカーが示すのは正規表現の終わり(または|かつ)始まりの場所であり、文字そのものにマッチするものではない。次の例がある。 エスケープ + 1 文字の例があるが、文字クラスエスケープと混同しないこと。
- $
文字列の末尾、または行の末尾にマッチ
- ^
文字列の先頭、または行の先頭にマッチ
- \b, \B
単語の境界にマッチ / 単語の境界以外にマッチ
- \<, \>
単語の先頭にマッチ / 単語の末尾にマッチ
- \A
- \Z
- \z
- \G
- \b{X}
修飾子
修飾子(modifier)とは、正規表現を利用した処理で、特定の処理方法を利用する指示記号のことをいう。 次の例がある。
- a 修飾子
ASCII 文字のみにマッチする
- c 修飾子
g 修飾子指定時にマッチに失敗しても、\G で参照される前回のマッチ位置の末尾をリセットしない。(Perl 固有?)
- d 修飾子
「.」や「^」、「$」が改行 (LF) のみを行終端子として認識するようにする。(Java 固有?)
- e 修飾子
文字列の置換を行う際、置換文字列として指定された内容を Perl のプログラムとして評価(evaluate)し、評価の結果を実際の置換文字列として利用する(perl 固有?)
- g 修飾子
指定した正規表現によるマッチが完了した後も、残りの文字列に対してマッチを繰り返す。cf. y 修飾子
- i 修飾子
大文字 / 小文字の違いを無視する(ignore)
- m 修飾子
マルチラインモード(multi-line mode)にする
- n 修飾子
キャプチャの対象を名前付きキャプチャのみとする。通常のパターンはキャプチャしない。
- o 修飾子
正規表現を1回だけコンパイルする(Perl 固有?)
- s 修飾子
「.」が行終端子にもマッチするようにする(single-line mode)
- u 修飾子
Unicode サポートの強化。強化の内容は各言語により異なる。
- x 修飾子
パターン内で空白とコメントが利用可能となる
- y 修飾子
g 修飾子と似ている。正規表現は前回のマッチ位置の直後にしかマッチしない。
- A 修飾子
パターンの先頭に「^」が付与されたのと同じ状態になる(Anchored)(PHP 固有?)
- D 修飾子
「$」は文字列の末尾にのみマッチするようになる(PHP 固有?)
- U 修飾子
PHP と Java で意味が異なる
- X 修飾子
PCRE の付加機能を有効にする(PHP 固有?)
- CANON_EQ フラグ
Unicode 文字のマッチ処理において、標準等価(canonical equivalence)を有効にする。
- (?modifier) 修飾子
- (?-modifier) 修飾子
- (?modifier:pattern) 修飾子
- (?-modifier:pattern) 修飾子
数量詞
数量詞とは、正規表現で一致させる文字や式の数を限定する役割を果たす文字である。x を変数、n, m を自然数とすると、次のものがある。 x*, x+, x?, x{n}, x{n,}, x{n, m}
以上は欲張り(greedy)マッチングである。欲張りとは、できるだけ長く一致させようとするものである。一方で、非欲張りとは、できるだけ短く一致させようとするものである。 非欲張りは次のようなものがある。x*?, x+?, x??, x{n}?, x{n,}?, x{n, m}?
複数の部分文字列のマッチング
次の問題を考える。
問 : 正規表現 /[a-z]*bara[a-z]*/ に合致する部分文字列を 'barako barbara barbaro embaraso najbara' から抜き出して、
配列 ar[0], ar[1], ... に格納せよ。
Ruby ならば文字列クラスの scan メソッドを使う。正規表現クラスの match メソッドを使うのであれば、ループを自前で作る必要がある。 Ruby の正規表現参照。
JavaScript では、 RegExp.prototype.exec() メソッドが Ruby の match メソッドに、そして String.prototype.match() や String.prototype.matchAll() というメソッドが Ruby の scan メソッドに該当する。
Python ならば、正規表現操作の re を用いて、search() が Ruby の match メソッドに、そして findall() が Ruby の scan メソッドに該当する。
正規表現が適当でないとき
正規表現を使うのが適切でないときもある。たとえば、HTML の要素を Python で調べたり変更したりするときには、 Beautiful Soup を使うのが適切である。
リンク
- 正規表現パターンマッチング(JavaScript)
- 正規表現(Ruby)