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

広告

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

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

(複数の文字)メタ文字

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

/a(good!)+b/

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

マッチするもの:

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

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

サンプルプログラム

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

test6-1.rb

#! ruby -Ku
require "kconv"

def check(str)
  if /G(oog)+le/ =~ str then
    print(Kconv.tosjis("○") + str + "¥n")
  else
    print(Kconv.tosjis("×") + str + "¥n")
  end
end

print(Kconv.tosjis("「G(oog)+le」にマッチするかどうか¥n¥n"))

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

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

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

( Written by Tatsuo Ikura )