- Home ›
- Ruby正規表現の使い方 ›
- 任意の文字と繰り返し(量指定子) ›
- HERE
直前の文字を指定した範囲の回数繰り返し({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回
どちらの表記を使っても構いませんが、条件に合うのであれば「*」「+」「?」のメタ文字を使用した方がコンパクトに記述することが可能です。
サンプルプログラム
では簡単なプログラムで確認して見ます。
#! 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です。そして下記のように実行して下さい。
( Written by Tatsuo Ikura )