Rubyがミニツク

あなたのRubyの技術に関するより詳しい知識と理解を増やします。

Ruby入門コース

このコースについて

Rubyのeラーニング研修システムはRailsを使ってWebアプリケーション開発ができる技術者の育成を目指します。 そのため、Railsを扱うことができるだけのRubyの知識を得ることがRuby入門コースの目標となっています。

コンテンツ一覧

ヒント レッスンの名前をクリックすると、その内容を表示します。

次のコンテンツ ホームへ戻る

正規表現の繰り返し

同じパターンが続くテキストにマッチさせたい時は、繰り返しを意味する文字を使います。

  • 0回以上の繰り返し(*)
  • 1回以上の繰り返し(+)
  • 0回、または1回の繰り返し(?)

「*」と「+」はマッチする対象に違いがあります。「*」は直前の文字が0個以上続くパターンとマッチします。「+」は直前の文字の1回以上続くパターンとマッチします。

str = "abbbbbc"
p str.gsub(/ab*c/, "replace")  #=> replace
p str.gsub(/ab+c/, "replace")  #=> replace
str = "ac"
p str.gsub(/ab*c/, "replace")  #=> replace
p str.gsub(/ab+c/, "replace")  #=> ac

「?」はその前の文字が0個か1個ある場合にのみマッチします。

str = "ac"
p str.gsub(/ab?c/, "replace")  #=> replace
str = "abc"
p str.gsub(/ab?c/, "replace")  #=> replace
str = "abbbbbc"
p str.gsub(/ab?c/, "replace")  #=> abbbbbc 

他にも「*?」や「+?」のように組み合わせることで繰り返しを表せます。ただし、こちらの繰り返しは「?」が付かない記号とマッチする範囲が違います。
「*?」や「+?」のように表示している「?」は、直前の文字が0個か1個ある場合にのみマッチするという意味ではなく、最短一致でマッチングをおこなうことを表します。

str = %q(<p>foo</p>)

# 最長一致
str.gsub(/<.*>/, "<br>")   #=> "<br>"

# 最短一致
str.gsub(/<.*?>/, "<br>")  #=> "<br>foo<br>"

最長一致は、fooの前にある"<p>“の”<“から後ろの”</p>"の">"までのあいだにある文字を置き換えました。
最短一致は、fooの前後にある"<p>“を置き換えました。これは”<p>“の”<"と">"でマッチングしたと判定して置き換えた結果です。

これまでは1文字ずつの繰り返しとマッチするかを確かめていました。正規表現オブジェクトの中で()を使うことによって、複数の文字列の繰り返しとマッチするかを確かめることができます。

str = "Ruby Rub Ru R"
p str.gsub(/R.*/, "replace")   #=> replace
p str.gsub(/(Ruby)/, "replace")   #=> replace Rub Ru R


次のコンテンツ ホームへ戻る