直前の文字をmin回以上max回以下繰り返す文字列にマッチする({min,max})

直前の文字を指定した範囲の回数だけ繰り返し表れる場合にマッチするパターンを定義できます。例えば直前の文字を 3 回から 7 回まで繰り返す場合にマッチするパターンを作成できます。ここでは Ruby の正規表現で直前の文字を指定した範囲の回数繰り返した文字列にマッチするメタ文字「{min,max}」の使い方について解説します。

(Last modified: )

直前の文字をmin回以上max回以下繰り返す文字列にマッチする

{min,max} は直前の文字を min 回以上 max 回以下繰り返す文字列にマッチします。範囲の回数の指定方法は次の通りです。

{min,max}

例えば直前の文字が 2 回から 4 回の範囲で繰り返し現れる場合にマッチする場合は次のように記述します。

/Go{2,4}gle/

上記の場合、直前の文字(今回は「o」)が指定した範囲の 2 回から 4 回の間繰り返し現れた場合にマッチします。その為、今回の場合でマッチするのは「oo」「ooo」「oooo」の場合です。

マッチするもの:

Google
Gooogle
Goooogle

マッチしないもの:

Ggle
Gogle
Gooooogle
Goooooogle
Gmgle

2番目の引数を省略する

2 番目の引数は省略することが可能です。 2 番目の引数を省略すると、直前の文字の最小出現回数だけが設定されます。上限はありません。

{min,}

カンマ(,)は省略しないで下さい。省略した場合は別の意味となります。

例えば直前の文字が 2 回以上繰り返し現れる場合にマッチする場合は次のように記述します。

/Go{2,}gle/

上記の場合、直前の文字(今回は「o」)が指定した範囲の 2 回以上繰り返し現れた場合にマッチします。その為、今回の場合でマッチするのは「oo」「ooo」「oooooooo」などです。

マッチするもの:

Google
Gooogle
Goooogle
Gooooogle
Goooooogle

マッチしないもの:

Ggle
Gogle
Gmgle

なお1番目の引数を省略した {,max} や両方の引数を省略した {,} はエラーとはなりませんが、マッチが必ず失敗します。

回数を指定する

括弧{}の中に数値を1つだけ指定すると指定した回数だけ直前の文字が現れる場合にマッチします。

{num}

例えば直前の文字が 3 回現れる場合にだけマッチする場合は次のように記述します。

/Go{3}gle/

上記の場合、直前の文字(今回は「o」)が 3 回現れた場合にマッチします。その為、今回の場合でマッチするのは「ooo」です。

マッチするもの:

Gooogle

マッチしないもの:

Ggle
Gogle
Google
Goooogle
Gooooogle
Gmgle

メタ文字「*」「+」「?」との関係

範囲指定を使えばアスタリスク(*)、プラス(+)、クエスチョン(?)のメタ文字を範囲を使って表すことができます。

*   {0,}     直前の文字を0回以上繰り返し
+   {1,}     直前の文字を1回以上繰り返し
?   {0,1}    直前の文字が0回か1回

どちらの表記を使っても構いませんが、条件に合うのであれば「*」「+」「?」のメタ文字を使用した方がコンパクトに記述することが可能です。

サンプルコード

では簡単なプログラムで確認してみます。

# encoding: UTF-8

def check(str)
  if /Go{2,3}gle/ =~ str then
    puts("○" + str)
  else
    puts("×" + str)
  end
end

print("「Go{2,3}gle」にマッチするかどうか")

check("Ggle")
check("Gogle")
check("Google")
check("Gooogle")
check("Goooogle")
check("Gooooogle")

下記のように実行して下さい。

直前の文字を指定した範囲の回数繰り返し({min,max})

-- --

Ruby の正規表現で直前の文字を指定した範囲の回数繰り返した文字列にマッチするメタ文字「{min,max}」の使い方について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。