正規表現

作成日 : 2023-03-25
最終更新日 :

概要

このページは正規表現に関するまとめページである。

正規表現が使われる場面

正規表現は、特定の処理系(コマンドやアプリケーション、コンピュータ言語、ライブラリなど)で、 文字列の照合(マッチング)や取り出し(キャプチャ)などを簡潔な記法で表現するための記法である。 正規表現はまた、文字列の置換でもよく使われる。

正規表現を扱う本の対象範囲

正規表現を扱う処理系
処理系文献備考
egrep[1]
sed[1]
awk[1]
vim[1]
Perl[1], [2]
PHP[1], [2][2] では PCRE として解説されている
.NET[1], [2]
Java[1], [2]
JavaScript[1], [2]
Python[1], [2]
Ruby[2]

そのほか、現代のコンピュータ言語であれば普通正規表現は使える。古典的な言語でも、 適切なライブラリ・モジュールを入れれば正規表現は使えると思う( 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)とは、正規表現を利用した処理で、特定の処理方法を利用する指示記号のことをいう。 次の例がある。

i 修飾子

c 修飾子

d 修飾子

e 修飾子

g 修飾子

指定した正規表現によるマッチが完了した後も、残りの文字列に対してマッチを繰り返す。cf. y 修飾子

i 修飾子

m 修飾子

o 修飾子

s 修飾子

u 修飾子

x 修飾子

D 修飾子

U 修飾子

X 修飾子

CANON_EQ 修飾子

(?modifier) 修飾子
(?-modifier) 修飾子

(?modifier:pattern) 修飾子
(?-modifier:pattern) 修飾子

y 修飾子

g 修飾子と似ている。正規表現は前回のマッチ位置の直後にしかマッチしない。

a 修飾子

n 修飾子

複数の部分文字列のマッチング

次の問題を考える。

問 : 正規表現 /[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 メソッドに該当する。

リンク

まりんきょ学問所コンピュータの部屋 > 正規表現


MARUYAMA Satosi