正規表現の特殊文字

正規表現では、"あ" という文字を指定すると、「あ」という文字そのものを 含む行全てにマッチする。"AB"という文字列を指定すると、「AB」という文字列 を含む行ならどれでもマッチする。アルファベットや日本語など普通の文字や文 字列を指定すると、それ自身が含まれるものとマッチする。

通常の文字以外に、特別な記号を使うことで、文字そのもの以外に マッチする表現とすることができる。特別な意味を持つ記号について 解説する。検索のときに特別な意味を持つ文字のことを メタキャラクタ という。

代表的なメタキャラクタ

. (ピリオド)

記号 . は、任意の1文字にマッチする。 たとえば、正規表現 ai.awa は、"ai" のうしろに 何でもいいので何か1文字が来て、そのあとに "awa" が続くようなものを 含む行全てにマッチする。たとえば、以下のようになる。

照合する文字列 マッチするか?
aikawa
aizawa
aisawa
aimoto ×
ai awa
[ ] (大括弧)

大括弧 [ ] は、その中に列挙した文字のどれかに 一致するものがマッチするようになる。たとえば、正規表現 [abc] は、大括弧の中に a と b と c が列挙してあるので 文字 a, b, c のどれかにマッチする。さらに、正規表現 ai[sz]awa でいくつかの文字列と照合を行なったときの結 果は次のようになる。

照合する文字列 マッチするか?
aikawa ×
aizawa
aisawa
aimoto ×
ai awa ×

大括弧の中で -(ハイフン) を使うと文字の範囲を指定 できる。たとえば正規表現 [0-9] は、文字 "0" から文字 "9" の範囲の全ての文字、つまり 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 のいず れにもマッチする。もし、マッチする文字としてハイフン自体を指定した いときは大括弧の先頭に記述する。たとえば、正規表現 [-a-z0-9] は、「ハイフン、または a〜z のどれか、また は0〜9のどれか」にマッチする。

大括弧の中の先頭に ^ (山記号; キャレット) を指定す ると、そのあとに列挙した文字以外 であるものにマッチする。 たとえば、正規表現 [^a-z] は、a〜z 以外の文字であれば どれでもマッチする。

?

記号 ? は、直前のパターンが0回か1回出現する という意味を付加する。直前のパターンは文字でも記号でも良い。たとえ ば、正規表現 sai?toh は、? の直前が i なので、iが0個でも1個でも良いことを意味する。さらにたとえば、 正規表現 sa[ei]?ki は、直前のパターンが [ei] なので、「eかi」の文字が0個でも1個でも良いことを 意味する。つまり、sa[ei]?kiにマッチするのは、 saeki, saiki, saki のどれかを含む行に限ることになる。

直前のパターンが0文字の場合にもマッチするので、 ?が正規表現の最後になることはない (指定しても良いが意味がない)
例: sai?sa で検索するのと同じ 結果になる。

*

記号 * は、直前のパターンが0回以上出現する という意味を付加する。直前のパターンは文字でも記号でも良い。たとえ ば、正規表現 sai*toh は、* の直前が i なので、iが0個以上なら何個でも良いことを意味する。つまり、 satohでもsaitohでもsaiitohでもsaiiiiiitohでもマッチする。 さらにたとえば、 正規表現 sa[ei]*ki は、直前のパターンが [ei] なので、「eかi」の文字が0個以上なら何個でも良いことを 意味する。

正規表現 .* は、直前のパターンが .(任 意の文字) なので、何でも良い文字列が何文字続いても良いことを意味す る。つまり、どんな文字列でもマッチする(良く使う)。

直前のパターンが0文字の場合にもマッチするので、 *が正規表現の最後になることはない (指定しても良いが意味がない)
例: sai*sa で検索するのと同じ 結果になる。

+

記号 + は、直前のパターンが1回以上出現する という意味を付加する。回数が「1回以上」という点を除いて記号 * と全く同じと考えて良い。

直前のパターンが1文字の場合にもマッチするので、 +が正規表現の最後になることはない (+を最後に書くのなら、+を 省略しても同じ行がマッチする)

^

記号 ^正規表現の先頭に指定した 場合のみ行の先頭にマッチする。たとえば、 正規表現 ^sato は、先頭が sato から始まるもののみに マッチする。文字列の途中に sato が含まれてもマッチしない。つまり、 以下のようになる。

照合する文字列 マッチするか?
sato san
satoh desu
I am sato ×
Sato! ×
$

記号 $正規表現の末尾に指定した 場合のみ行の末尾にマッチする。たとえば、 正規表現 sato$ は、一行が sato で終わるもののみに マッチする。

|

記号 |(縦棒; パイプ) は、「または」の意味で、 | の左右のパターンどちらかにマッチすれば良いことを意 味する。たとえば、正規表現 SAITO|IIMORI は、 SAITO または IIMORI のどちらかを含むものならどれでもマッチする。

( )

丸括弧 ( ) は、数学の括弧と似ていて、長い正規表現 の一部分だけを括るときに利用する。たとえば、正規表現 a(wa|ma|yanokou)ji は、| (または)で むすぶ範囲を限定しているので、結果として awaji, amaji, ayanokouji のどれかを含むものにのみマッチする。

また、正規表現 a(re)+ は、+ の 直前のパターンを括弧で括り (re) としているので、 are, arere, arerere, arererere, ... などにマッチする。もし ( ) で括らずに、are+ とすると、 + の直前が e だけになるので、are, aree, areee, ... にマッチすることになる。

このように、正規表現の一部を丸括弧で括って一つのかたまりにする ことを、グルーピングという。元の文字列のうち、グルーピン グした部分にマッチした部分文字列はあとで抽出することができる。

\数字

バックスラッシュ \ の後ろに数字 N を続けると、元の 正規表現のN番目の括弧にマッチした文字列そのものの置き換えとなる。 たとえば、正規表現 (bye|ciao) \1 は、最初の括弧で "bye" または "ciao" にマッチする。次の \1 は、1番目の 括弧でマッチした文字列そのものに置き換えられるので、最初にマッチし たものが "bye" なら "bye" 、"ciao"なら"ciao"にマッチする。つまり、 "bye bye" または "ciao ciao" のみにマッチする。もし、 \1 を使わずに、正規表現を (bye|ciao) (bye|ciao) とすると、2個目の括弧も "bye" "ciao" どちらでもよくなるの で、"bye bye", "bye ciao", "ciao bye", "ciao ciao" どれにでもマッ チすることになる。\数字 を使うと、1行の中にある文字列 が繰り返して現れるパターンを記述することができる。

\s

正規表現中の \s は、あらゆる空白 文字にマッチする。スペースやTAB文字、改行文字などにマッチす る。

\S

正規表現中の \S は、空白文字 以外の全ての文字にマッチする。ちょうど\sの逆で ある。

\d

正規表現中の \d は、0〜9(半角)のどれかにマッチする。 たとえば、正規表現 \d+ は、0〜9が1回以上くり返したも のにマッチするので、数字と思われるものを含む行全てにマッチする。

\D

\D は、数字以外の全ての文字にマッチする。 \dの逆である。

正規表現オプション

正規表現の直後に文字を追加すると正規表現の検索方法を変えることができ る。たとえば、デフォルトでは日本語文字の検索ができないが、正規表現指定の 直後にeをつけて、 /あいうえお/e などとすると、EUCコードで書かれた日本語の検索 が行なえるようになる。これを正規表現オプションという。 このようなオプションのうち覚えておくべきものを紹介する。

正規表現の指定方法

最初に紹介したRubyでの正規表現指定方法は、パターンを / / で括るという ものだった。それ以外にもいくつか方法がある。 プログラム中で正規表現を指定するには以下のどれかを使う。


本日の目次