複数の文字をグループ化して指定した回数繰り返す文字列にマッチする

メタ文字の「*」「+」「?」及び範囲を指定する {min,max} を使用する場合、繰り返しの対象はメタ文字の直前の一文字だけでした。ここでは Ruby の正規表現で対象を 1 文字ではなく複数の文字を 1 つのグループとして扱い、複数の文字を繰り返しの対象にする方法について解説します。

(Last modified: )

複数の文字をグループ化して指定した回数繰り返す文字列にマッチする

複数の文字を対象にするには、複数の文字を () で囲みグループにします。記述方法は次のようになります。

(複数の文字)メタ文字

上記では「(」から「)」で囲まれた文字列全体が繰り返しの対象となります。メタ文字には「*」や「+」などを指定します。例えば「good!」と言う5つの文字が1回以上繰り返されて現れた場合にマッチする正規表現は次の通りです。

/a(good!)+b/

上記の場合、「(」から「)」で囲まれた間に書かれた文字が 1 つのグループとなります。そしてメタ文字の「+」は直前にある文字が 1 回以上繰り返された場合にマッチしますが、今回は直前の文字がグループなのでグループの中の複数の文字が 1 回以上繰り返された場合にマッチします。

マッチするもの:

agood!b
agood!good!b
agood!good!good!good!good!b

グループ化を用いることで、文字の集まりである文字列を対象とした繰り返しをパターンとして定義することができます。

サンプルコード

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

# encoding: UTF-8

def check(str)
  if /G(oog)+le/ =~ str then
    puts("○" + str)
  else
    puts("×" + str)
  end
end

puts("「G(oog)+le」にマッチするかどうか")

check("Gle")
check("Goole")
check("Google")
check("Googoogle")
check("Googoogoogle")
check("Googole")
check("Googgle")
check("Googogole")

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

グループ化して複数の文字を繰り返す

-- --

Ruby の正規表現で対象を 1 文字ではなく複数の文字を 1 つのグループとして扱い、複数の文字を繰り返しの対象にする方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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