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

広告

直前の文字を指定した範囲の回数だけ繰り返し表れる場合にマッチするパターンを定義できます。例えば3回から7回まで繰り返される場合にマッチさせたりすることが出来ます。

範囲の回数の指定方法は次の通りです。

{min,max}

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

/Go{2,4}gle/

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

マッチするもの:

Google
Gooogle
Goooogle

マッチしないもの:

Ggle
Gogle
Gooooogle
Goooooogle
Gmgle

引数を省略する

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

{min,}

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

指定する範囲は「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回

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

サンプルプログラム

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

test5-1.rb

#! ruby -Ku
require "kconv"

def check(str)
  if /Go{2,3}gle/ =~ str then
    print(Kconv.tosjis("○") + str + "¥n")
  else
    print(Kconv.tosjis("×") + str + "¥n")
  end
end

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

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

上記のプログラムを「test5-1.rb」として保存します。文字コードはUTF-8です。そして下記のように実行して下さい。

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

( Written by Tatsuo Ikura )