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

広告
eyecatch

正規表現で使用するメタ文字の一つであるアスタリスク(*)、プラス(+)、クエスチョンマーク(?)、そして {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

-- --

正規表現で使用するメタ文字の一つであるアスタリスク(*)、プラス(+)、クエスチョンマーク(?)、そして {num, num} の使い方について解説しました。

( Written by Tatsuo Ikura )

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

著者 / TATSUO IKURA

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