Ruby : 正規表現

作成日 : 2023-03-12
最終更新日 :

正規表現クラス

正規表現は当然 Ruby でも実現できる。では次の問題はどうだろう。
問 : 正規表現 /[a-z]*bara[a-z]*/ に合致する部分文字列を 'barako barbara barbaro embaraso najbara' から抜き出して、 配列 ar[0], ar[1], ... に格納せよ。
Ruby で正規表現で文字列との合致を見るのは match メソッドだ。だから、 /[a-z]*bara[a-z]*/.match('barako barbara barbaro embaraso najbara') で得られるだろう、 と考えるのだが、うまくいかない。

ここで頭を切り替えよう。String クラスの scan メソッドを使うほうがいい。
String#scan(docs.ruby-lang.org)

ar = "barako barbara barbaro embaraso najbara".scan(/[a-z]*bara[a-z]*/)
p ar # => ["barako", "barbara", "embaraso", "najbara"]

scan メソッドでの戻り値は文字列の配列である。文字列より詳細なマッチング情報を得るためには、ループをまわす必要がある。 以下の例は、山田祥寛「独習 C 言語」p.295 を参考に作った例だ。

poz = 0
p teksto = 'かっぱかっぱらった かっぱらっぱかっぱらった とってちってた' # 谷川俊太郎「ことばあそびうた」
loop do
  sekvo = /([あ-ん])っ([あ-ん])/.match(teksto, poz)
  break unless sekvo
  puts "マッチした文字列 : #{sekvo[0]}"
  puts "促音便前の文字列 : #{sekvo[1]}"
  puts "促音便後の文字列 : #{sekvo[2]}"
  poz = sekvo.end(0) # 次の開始位置
end

リンク

まりんきょ学問所Rubyの浮き輪 > Ruby : 正規表現


MARUYAMA Satosi