正規表現で利用できるメタ文字の一覧と使い方

広告
eyecatch

正規表現とは指定した条件に一致する複数の文字列を一つのパターンで表現する方法です。正規表現を使えば例えば末尾が「or」または「er」で終わる文字列や、「A」で始まり「n」で終わる 5 文字の文字列などを一つのパターンで表現できます。ここでは正規表現で使われるメタ文字の種類や使い方など正規表現の基礎知識について解説します。

日付/時刻やメールアドレスなどにマッチする正規表現のサンプルについては「正規表現のサンプル一覧」をご参照ください。

(2020 年 01 月 31 日公開 / 2020 年 02 月 06 日更新)

正規表現とは

先ほども書きましたが正規表現とは指定した条件に一致する複数の文字列を一つのパターンで表現する方法です。指定する条件は例えば「アルファベットと数値からなる 5 文字の文字列」や「末尾が ing で終わる文字列」など目的に合わせて条件を設定します。

正規表現は大量のデータの中から正規表現のパターンに一致する文字列を検索したり、見つかった文字列を別の文字列に置換する場合などに使われます。

例えば文書の中に含まれる 2015 2016 2017 2018 2019 の 5 つの文字列を行を検索したい場合で考えてみます。正規表現ではこの 5 つの文字列を次のように表現することができます。

201[5-9]

ひとつひとつ文字列を検索するのではなく 201[5-9] とマッチする行を検索することで一度の検索で処理を完了することができます。

他にも正規表現は入力された文字列が正規表現で表現されるパターンに一致するかどうかをチェックする時などに使われます。

例えば利用者に携帯電話の電話番号を入力してもらうテキストボックスがあったとします。携帯電話の電話番号は 090-xxxx-xxxx のように 070 または 080 または 090 で始まり、4 桁の数値が 2 つ続くものです。正規表現を使うと携帯電話番号のパターンは次のように表現することができます。

^0[789]0-¥d{4}-¥d{4}$

先ほどよりも少し複雑な正規表現となりました。テキストボックスに入力された文字列と ^0[789]0-¥d{4}-¥d{4}$ がマッチするかどうかを調べることで実際に使用できる(と思われる)携帯電話の電話番号が入力されたことを確認することができます。

※ 正規表現では対象となる文字列が正規表現で表現されるパターンに当てはある場合にマッチするという表現をします。

正規表現は通常の文字とメタ文字と呼ばれる特殊な意味を持つ文字の組み合わせでパターンを作っていきます。慣れないと分かりにくいですけど、一つ一つのメタ文字の意味は明確ですので使い方だけ覚えてしまえば複雑な条件の正規表現も自由に作れるようになると思います。

正規表現のパターンがどのようにマッチするか

具体的に正規表現で用意されているメタ文字の使い方を見ていく前に、正規表現で表現したパターンが対象の文字列に対してどのようにマッチしているのかしていないのかを判別するのかについて簡単に解説してみます。

対象となる文字列は 1 つの単語でもいいですし、複数の単語からなる文でも構いません。単語であれば "Apple" や "東京都中央区" などですし、文であれば "Tomorrows weather is sunny" のような文となります。今回は "HIPPOPOTAMUS" という文字列を対象にしてみます。

正規表現を使ったパターンは、通常の文字と特別な意味を持つメタ文字を組み合わせたものとなります。では最初にパターンとして通常の文字だけを使った "P" とした場合に対象の文字列とマッチするのかどうかを見ています。

正規表現の基本(1)

通常の文字は同じ文字とだけマッチします。パターン "P" は対象の文字列 "HIPPOPOTAMUS" の中の "P" とマッチするのでパターンは対象の文字列とマッチします。

正規表現の基本(2)

次にパターンとして "PO" とした場合で考えてみます。この場合、最初に "P" とマッチし、かつ次の文字が "O" とマッチする必要があります。対象の文字列の中で最初に出てくる "P" は次の文字が "P" で "O" とマッチしません。

正規表現の基本(3)

ただ対象の文字列の中で二番目に出てくる "P" は次の文字が "O" で "O" とマッチします。その為パターンは対象の文字列とマッチします。

正規表現の基本(4)

次にメタ文字を使った場合も見ておきます。詳しくはこのあと解説していきますが、 ".*" というメタ文字は任意の文字の任意の個数にマッチします。パターンとして通常の文字と組み合わせて "P.*A" とした場合 "P" とマッチし任意の個数の文字が続いたあと "A" とマッチする必要があります。今回は対象の文字列とマッチしました。

正規表現の基本(5)

メタ文字を使った場合をもう一つ。 "^" というメタ文字は文字ではなく行の先頭という位置にマッチします。パターンとして通常の文字と組み合わせて "^PO" としたっ場合、行の先頭から "P" 次に "O" とマッチする必要があります。今回は行の先頭の文字が "H" でしたのでマッチしませんでした。

正規表現の基本(6)

対象の文字列と正規表現のパターンがどのようにマッチしているか判定しているのかお分かり頂けましたでしょうか。ではこの後で正規表現で用意されているメタ文字の一覧と使い方を一つ一つみていきます。

任意の一文字にマッチする:ドット(.)

正規表現のパターンは通常の文字とメタ文字と呼ばれる特別な意味を持った文字で構成されます。ここからは正規表現で使用されるメタ文字の使い方について解説します。最初はドット(.)からです。

ドット(.)は任意の一文字にマッチするメタ文字です。

.

例えば次のような正規表現のパターンで考えてみます。

P.n

"P" 、任意の一文字、 "n" 、と続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 Pan
〇 Pen
〇 P2n
× Pabn
× Pn

"P" の次の文字は任意の一文字とマッチしますのでアルファベットでも数値でもどんな文字でも一文字であればマッチします。ただマッチするのは一文字だけです。 "P" の後に二文字以上 "n" でない文字があったりした場合はマッチしません。

ドット(.)一つに付き任意の一文字とマッチしますので、ドット(.)を連続で使うことで任意の個数の任意の文字とマッチさせることができます。例えば次のような正規表現のパターンで考えてみます。

P...n

"P" 、任意の文字が 3 つ、 "n" 、と続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 Pacsn
〇 PPPPn
〇 P824n

なおドット(.)を連続で記述する代わりに繰り返しを表すメタ文字を使って記述することもできます。こちらはあとで解説します。

行頭と行末の位置にマッチする:^ $

キャレット(^)とドル記号($)は文字ではなく位置にマッチするメタ文字です。

キャレット(^)

キャレット(^)は行の先頭にマッチするメタ文字です。

^

例えば次のような正規表現のパターンで考えてみます。

^py

行の先頭、 "p" 、 "y" 、と続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 python
〇 pythagoras theorem
× happy birthday
× The python

"p" そして "y" と文字が続いていたとしても行頭にない場合はマッチしません。

ドル記号($)

ドル記号($)は行の末尾にマッチするメタ文字です。

$

例えば次のような正規表現のパターンで考えてみます。

py$

"p" 、 "y" 、行の末尾、と続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 happy
〇 backup copy
× happy birthday
× python

"p" そして "y" と文字が続いていたとしても行末にない場合はマッチしません。

キャレット(^)とドル記号($)を両方使い、次のようなパターンを使用することがよくあります。

^Cat$

行の先頭、 "C" 、 "a"、 "t" 、行の末尾、と続くパターンとなります。このパターンとマッチする文字列は "Cat" という単語だけになります。

〇 Cat
× mycat
× cats

単語の先頭と末尾にマッチする:¥b ¥B

¥b は単語の先頭または単語の末尾にマッチするメタ文字です。逆に ¥B は単語の先頭および末尾以外にマッチするメタ文字です。

単語の先頭と末尾:¥b

¥b は単語の先頭または単語の末尾にマッチするメタ文字です。

¥b

例えば次のような正規表現のパターンで考えてみます。

^bmy

単語の先頭、 "m" 、 "y" 、と続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 my book
〇 I like mystery novels
× Her name is Tommy

¥b は単語の先頭とマッチします。"m" そして "y" と文字が続いていたとしても単語の先頭にない場合はマッチしません。

また同じメタ文字で ¥b は単語の単語の末尾にもマッチします。例えば次のような正規表現のパターンで考えてみます。

my^b

"m" 、 "y" 、単語の末尾、と続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 my book
〇 Her name is Tommy
× I like mystery novels

¥b は単語の末尾とマッチします。"m" そして "y" と文字が続いていたとしても単語の末尾にない場合はマッチしません。

¥b を単語の先頭と末尾でマッチさせた場合です。例えば次のような正規表現のパターンで考えてみます。

^bmy^b

単語の先頭、 "m" 、 "y" 、単語の末尾、と続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 my book
〇 This is my book
× I like mystery novels
× Her name is Tommy

¥b は単語の先頭と末尾にそれぞれマッチします。"my" という単語のみマッチします。

単語の先頭と末尾以外:¥B

¥B は ¥b とは逆に単語の先頭および単語の末尾以外にマッチするメタ文字です。

¥B

例えば次のような正規表現のパターンで考えてみます。

^bmy

単語の先頭以外、 "m" 、 "y" 、と続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 Her name is Tommy
× my book
× I like mystery novels

¥B は単語の先頭や末尾以外とマッチします。"m" そして "y" と文字が続いていたとしても単語の先頭からの場合はマッチしません。

直前の文字の繰り返し:* + ? {num, num}

アスタリスク(*)、プラス(+)、クエスチョンマーク(?)、そして {num, num} はそれぞれ繰り返しを表現する時に使用されるメタ文字です。量指定子とも呼ばれます。

*
+
?
{num, num}

アスタリスク(*)

最初にアスタリスク(*)の使い方です。パターンの中でアスタリスク(*)が使われた場合、アスタリスク(*)の直前の文字が 0 回以上連続する文字にマッチします( 0 回以上というのは一度もなくてもいいし何回出てもいいという意味です)。例えば次のような正規表現のパターンで考えてみます。

Go*l

"G" 、 "o" が 0 回以上続く文字、 "l" 、と続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 Gl
〇 Gol
〇 Goool
〇 Goooooooool
× Goonool

アスタリスク(*)の直前の文字である "o" が一回も現れなくてもマッチします。

プラス(+)

次にプラス(+)の使い方です。パターンの中でプラス(+)が使われた場合、プラス(+)の直前の文字が 1 回以上連続する文字にマッチします。例えば次のような正規表現のパターンで考えてみます。

Go+l

"G" 、 "o" が 1 回以上続く文字、 "l" 、と続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 Gol
〇 Goool
〇 Goooooooool
× Gl
× Goonool

プラス(+)の直前の文字である "o" が一回も現れない場合はマッチしません。

クエスチョンマーク(?)

次にクエスチョンマーク(?)の使い方です。パターンの中でクエスチョンマーク(?)が使われた場合、クエスチョンマーク(?)の直前の文字が 0 回または 1 回現れる文字にマッチします。例えば次のような正規表現のパターンで考えてみます。

Go?l

"G" 、 "o" が 0 回または 1 回続く文字、 "l" 、と続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 Gl
〇 Gol
× Goool
× Goooooooool
× Goonool

クエスチョンマーク(?)の直前の文字である "o" は 0 回または 1 回だけ現れる場合にマッチします。

{num, num}

最後に {num, num} の使い方です。直前の文字を何回繰り返すのかを明示的に指定できます。数値をいくつ指定するかで使い方が異なります。次をみてください。

{num}      直前の文字を num 回繰り返す
{min,}     直前の文字を min 回以上繰り返す
{,max}     直前の文字を max 回以下繰り返す
{min,max}  直前の文字を min 回以上 max 回以下繰り返す

例えば次のような正規表現のパターンで考えてみます。

Go{4}l

"G" 、 "o" の文字が 4 回連続で続く文字、 "l" 、と続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 Gooool
× Gl
× Gool
× Goooooooool

"o" が 4 回続く場合だけマッチします。

もう一つ今度は次のような正規表現のパターンで考えてみます。

Go{2,4}l

"G" 、 "o" の文字が 2 回以上 4 回以下の回数連続で続く文字、 "l" 、と続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 Gool
〇 Goool
〇 Gooool
× Gl
× Gol
× Goooool

"o" が 2 回から 4 回続く場合だけマッチします。

正規表現における最短一致と最長一致

アスタリスク(*)、プラス(+)など直前の文字を繰り返すメタ文字を使用する場合に注意しなければいけないのは、対象の文字列のどの部分にマッチするかを気にしなければいけない場合で明示的に指定しない場合はできるだけたくさんの文字とマッチしようとします。

例えば "Happy day" という文字列を対象に次のような正規表現のパターンでマッチさせた場合で考えてみます。

a.+y

"a" 、 任意の文字が 1 回以上続く文字、 "y" 、と続くパターンとなります。対象の文字列が "Happy day" だった場合、このパターンにマッチするのは次の二通りがあります。

Happy day

Happy day

前者のように一番短くマッチする場合を最短一致、後者のように一番長くマッチする場合を最長一致といいますが、デフォルトでは最長一致でマッチします。

最長一致ではなく最短一致でマッチさせたい場合には、繰り返しで使用するメタ文字の最後に "?" を付けた次のメタ文字を使用します。

*?
+?
??
{num, num}?

先ほどのパターンで最短一致でマッチさせたい場合は次のように記述することになります。

a.+?y

いずれか一文字にマッチする:[]

角括弧([...])は角括弧の中に記述した複数の文字のいずれか一つにマッチさせる場合に使用するメタ文字です。文字クラスとも呼ばれます。

[...]

例えば次のような正規表現のパターンで考えてみます。

D[aio]m

"D" 、 "a" または "i" または "o" のいずれかの文字、 "m" 、と続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 Dam
〇 Dim
〇 Dom
× Dem
× Daim

このように指定した複数の文字のいずれかにマッチさせたい場合に使用します。

キャレット(^)を使った否定

角括弧[]を使用する時に先頭にキャレット(^)を記述すると、角括弧の中に記述した複数の文字以外の文字にマッチするようになります。

[^...]

例えば次のような正規表現のパターンで考えてみます。

D[^aio]m

"D" 、 "a" および "i" および "o" 以外のいずれかの文字、 "m" 、と続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 Dcm
〇 Dzm
〇 D4m
× Dam
× Dim
× Dom
× Daim

なおキャレット(^)は角括弧[]の一番最初に記述した場合だけ否定の意味になります。その他の位置でキャレット(^)を記述した場合は文字そのもののキャレット(^)の意味になります。

ハイフン(-)を使った範囲の指定

角括弧を使用したパターンでは連続した文字を指定する場合がよくあります。次のような正規表現のパターンをみてください。角括弧の中に 0 から 9 までの連続した文字が記載されています。

201[0123456789]年

"2" 、 "0" 、 "1" 、 "0" から "9" までのいずれか一文字、 "年" 、と続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 2010年
〇 2011年
〇 2012年
〇 2013年
〇 2014年
〇 2015年
〇 2016年
〇 2017年
〇 2018年
〇 2019年
× 2020年

このように 0 から 9 までのいずれかの数字一文字といった場合や、 a から z までのいずれかの小文字のアルファベット一文字にマッチさせたいというケースはよくあります。

0から9までの数値:
[0123456789]

aからzまでの小文字のアルファベット
[abcdefghijklmnopqrstuvwxyz]

AからZまでの大文字のアルファベット
[ABCDEFGHIJKLMNOPQRSTUVWXYZ]

そして上記のように文字コード上で連続している文字であればハイフン(-)を使って [0-9] や [a-z」 のように範囲指定を使った記述を行えます。

0から9までの数値:
[0123456789] <==> [0-9]

aからzまでの小文字のアルファベット
[abcdefghijklmnopqrstuvwxyz] <==> [a-z]

AからZまでの大文字のアルファベット
[ABCDEFGHIJKLMNOPQRSTUVWXYZ] <==> [A-Z]

ハイフンを使った範囲指定の記述方法を使うことで最初に記載した正規表現のパターンは次のように表現することができます。

201[0-9]年

範囲指定は [3-7] や [d-m] のように一部分だけの範囲でも指定できます。また他の文字や範囲指定と組み合わせて [a-dfgk] や [0-9a-f] のような表現もできます。

[3-7] <==> [34567]
[a-dfgk] <==> [abcdfgk]
[0-9a-f] <==> [0123456789abcdef]

なお文字コード上で連続していると記載しているのは、例えば数字であればたまたま "0" から "9" までが文字コード上で順番に並んでいるので "0" の文字から "9" の文字までの範囲の文字という意味で [0-9] と表現することができました。

全角のひらがなは "あ" から "ん" までが "あいうえお・・・ん" と文字コード上で順番に並んでいるわけではなく、例えば Unicode の文字コードであれば全角ひらがなは「ぁあぃいぅうぇえぉおかがきぎ ・・・ ゎわゐゑをん」のように並んでいますので [あ-ん] と表現すると想定していたものよりもたくさんの文字がマッチするかもしれません。

角括弧の中でのメタ文字の扱い

正規表現のパターンではドット(.)やプラス(+)やドル記号($)などはメタ文字として特別な意味を持ちますが、角括弧の中で記述された場合は単なる文字として扱われます。例えばパターンとして [a.$] のように表現されていた場合は "a" か "." か "$" のいずれか一つにマッチします。

ただし例外がありバックスラッシュ(¥)、ハイフン(-)、キャレット(^)、終わり角括弧(])の4つについては特別な文字として扱われます(バックスラッシュ以外は記述した位置によっては単なる文字として扱われます)。

ハイフン(-)は [a-z] のように範囲の指定として使われるため、文字としてハイフンを使用したい場合にはバックスラッシュを使って ¥- と記述する必要があります。ただし角括弧の先頭または最後に記述した場合はバックスラッシュは不要です。

[abc¥-def]
[-abcdef]
[abcdef-]

キャレット(^)は角括弧の先頭に記述すると [^abc] のように「・・・ではない」という否定の意味で使われます。角括弧の先頭以外に記述した場合はバックスラッシュは不要です。

[¥^abcdef]
[abc^def]

終わり角括弧(])は角括弧の終わりを意味するので、文字として使用する場合にはバックスラッシュを使って ¥] と記述する必要があります。ただ例外として角括弧の先頭に記述した場合はバックスラッシュは不要です(ただし記述ミスのようにも見えますのでバックスラッシュによるエスケープを行う方がいいかもしれません)。

[abc¥]def]
[]abcdef]

バックスラッシュ(¥)を文字として使用する場合はどこに記述する場合でもバックスラッシュを使って ¥¥ と記述する必要があります。

[abc¥¥def]

複数のパターンのどれかにマッチする:|

縦棒(|)は、縦棒(|)で区切って記述された複数のパターンのいずれかの文字列の一つにマッチさせる場合に使用するメタ文字です。

Pattern1|Patter2|Patter3| ...

例えば次のような正規表現のパターンで考えてみます。

Red|Green|Yellow

"Red" または "Green" または "Yello" のいずれかとマッチする文字列、というパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 Red
〇 Green
〇 Yellow
× White
× Black

パターンの中の一部を縦棒(|)を使って選択できるようにすることもできます。次の正規表現のパターンをみてください。

(2020|令和2)年

"2020" または "令和2" のどちらかの文字列、 "年" 、 と続くパターンとなります。他の文字やメタ文字と組み合わせる場合は、パターンの中のどこからどこまでが選択する部分なのかが分かるように丸括弧()で囲います(グループ化といいます)。このパターンとマッチする文字列は例えば次のようなものになります。

〇 2020年
〇 令和2年

メタ文字をエスケープして通常の文字として扱う

メタ文字として使われるドット(.)や縦棒(|)などはパターンの中で使われると特別な意味を持ちますが、バックスラッシュ(¥)を使ってエスケープすることで文字としてマッチさせることができます。エスケープするにはメタ文字の前にバックスラッシュ(¥)を記述してください。

¥.
¥?
¥+
¥|

例えば次のような正規表現のパターンで考えてみます。

example¥.com

"example" 、 "." 、 "com" 、と続くパターンとなります。この中で "." はメタ文字として使われる文字のためバックスラッシュ(¥)を使ってエスケープを行い文字としてマッチさせています。このパターンとマッチする文字列は例えば次のようなものになります。

〇 example.com
× example_com

バックスラッシュ(¥)と文字で改行などの特殊な文字を表現する

改行やタブなど特殊な文字にマッチさせるためにバックスラッシュ(¥)と文字を組み合わせたメタ文字が利用できます。

¥f  改ページ
¥n  改行
¥r  復帰
¥t  タブ
¥v  垂直タブ

また同じ種類の複数の文字をまとめたメタ文字も利用できます。

¥d  数字 [0-9]
¥D  数字以外 [^¥d]
¥w  英数字とアンダーバー [0-9a-zA-Z_]
¥W  英数字とアンダーバー以外 [^¥w]
¥s  空白文字 [ ¥f¥n¥r¥t¥v]
¥S  空白文字以外 [^¥s]

例えば次のような正規表現のパターンで考えてみます。

090-¥d{4}-¥d{4}

"090-" 、数字が 4 つ連続する文字、 "-" 、数字が 4 つ連続する文字と、続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 090-1234-5678
〇 090-0000-0000
× 090-12ab-3456
× 090-123-4567

注意事項として正規表現を使用するすべてのツールやプログラミング言語でこれらのメタ文字がすべて使えるわけと保証されているわけではありません。ご自身が正規表現を使おうとしているツールや言語でサポートされているかどうかを確認されてください。

丸括弧()を使ったグループ化

丸括弧()を使用すると複数の文字をグループとしてまとめることができます。

(...)

グループとしてまとめた複数の文字に対して繰り返しのメタ文字であるアスタリスク(*)やプラス(+)を使用すると、直前の文字の繰り返しではなく直前のグループの繰り返しという意味になります。

例えば次のような正規表現のパターンで考えてみます。

m(Hop)+m

"m" 、 "Hop"が 1 回以上続く文字、 "m" 、というパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 mHopm
〇 mHopHopm
〇 mHopHopHopHopm

グループ化することで、直前の文字ではなく直前のグループの繰り返しにマッチさせることができるようになります。

なおグループ化の丸括弧()は複数のパターンから選択する縦棒(|)でも使用しました。こちらはどこからどこまでが選択肢なのかを明確にするために使用しています。

-- --

正規表現の基本的な知識について解説しました。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)
Profile
profile_img

著者 / TATSUO IKURA

初心者~中級者の方を対象としたプログラミング方法や開発環境の構築の解説を行うサイトの運営を行っています。