ruby gsub, gsub!
http://ref.xaio.jp/ruby/classes/string/gsub
gsubメソッドとgsub!メソッドは、文字列の中で正規表現のパターンにマッチした部分をすべて指定の文字列に置換します。gsub!については、#gsub!をご覧ください。
文字列で置換
str.gsub(pattern, replacement)
gsubメソッドの第1引数に正規表現のパターンpattern、第2引数に文字列replacementを指定すると、パターンにマッチする部分をすべてreplacementに置き換えた新しい文字列を返します。
第1引数に正規表現ではなく文字列を指定した場合は、その文字列と一致する部分をreplacementで置換します。
次の例は、改行文字をHTMLのbrに置き換えます。
s = "hello,\nworld\r\n" puts s.gsub(/(\r\n|\r|\n)/, "<br />")
hello,<br />world<br />
置換文字列の書式
第2引数replacementの中では、\1、\2、...でパターン中の( )に当てはまる部分を埋め込めます。また、次の書式が使えます。\&または\0(マッチした部分)、\`(マッチした部分より前)、\'(マッチした部分より後)、\+(最後のカッコの部分)。
次の例は、_で囲まれた部分をHTMLのemに置き換えます。二重引用符を使うときは"<em>\\1</em>"と書く必要があります。
s = "_Ruby_ is _cool_." puts s.gsub(/_(.+?)_/, '<em>\1</em>')
<em>Ruby</em> is <em>cool</em>.
第2引数replacementの中では、\の字を\\とする必要があります。Rubyの文字列リテラルで\\を表すには、\\\\と書かなければなりません。
次の例は、文字列中の改行文字を「\n」に置き換えます。こうした場合はブロックを使うほうが楽です。
s = "hello,\nworld\r\n"
puts s.gsub(/(\r\n|\r|\n)/, '\\\\n') # 文字列で置換する
puts s.gsub(/(\r\n|\r|\n)/) { '\n' } # ブロックを使う
hello,\nworld\n hello,\nworld\n
Ruby 1.9 Ruby 1.9では、パターンの中で(?<名前>パターン)という形でカッコに名前を付けられます。第2引数replacementの中では、\k<名前>という書式でそのカッコに当てはまる部分を埋め込めます。
s = "one two, three four, five six" puts s.gsub(/(?<first>\w+)\s+(?<second>\w+)/, '\k<second> \k<first>')
two one, four three, six five
ハッシュで置換
Ruby 1.9 Ruby 1.9では、第2引数に{ マッチした文字列 => 置換文字列 }のようにハッシュを指定できます。次の例は、文字列中の< > & "をHTMLの文字参照に置き換えています。
s = '<hello> & "world"'
puts s.gsub(/[<>&"]/,
"<" => "<", ">" => ">", "&" => "&", '"' => """)
<hello> & "world"
ブロックを使った置換
str.gsub(pattern) {|match| block }
gsubメソッドの第1引数に正規表現のパターンを指定してブロックを渡すと、パターンにマッチする部分をすべて取り出して繰り返しブロックを実行します。マッチした部分はブロックの戻り値に置き換わり、新しい文字列が返ります。ブロック変数matchには、マッチした部分が入ります。
次の例は、文字列中の単語を取り出して、先頭の文字を大文字に変えています。word.capitalizeの戻り値がブロックの戻り値になり、マッチした部分と置き換わります。
s = "hello, world"
puts s.gsub(/\w+/) {|word| word.capitalize }
Hello, World
ブロック中でパターン中の( )に当たる部分を取り出したいときは、組み込み変数の$1、$2、...を使います。また、$~や$`などの正規表現関連の組み込み変数も使えます。
次の例では、文字列中の[語句]から$1で語句を取り出し、Wikipediaへのリンクに変換しています。escapeとescapeHTMLはCGIクラスのメソッドです。
# encoding: utf-8
require 'cgi'
s = "[Ruby]による[オブジェクト指向プログラミング]"
t = s.gsub(/\[(.+?)\]/) do |text|
url = "http://ja.wikipedia.org/wiki/" + CGI.escape($1)
"<a href=\"#{url}\">#{CGI.escapeHTML($1)}</a>"
end
puts t
<a href="http://ja.wikipedia.org/wiki/Ruby">Ruby</a>による<a href="http://ja.wik ipedia.org/wiki/%E3%82%AA(中略)%E3%82%B0">オブジェクト指向プログラミング</a>
gsub!
str.gsub(pattern, replacement)
str.gsub!(pattern) {|match| block }
gsub!メソッドは、パターンにマッチした部分をすべて指定の文字列に置換します。レシーバ自身を変更するメソッドです。戻り値は、置換が行われたときはレシーバ自身、変更がなかったときはnilです。
引数の指定のしかたはgsubメソッドと同じです。gsubメソッドと同じく、ブロックを使うこともできます。
s = "hello, world"
s.gsub!(/\w+/) {|word| word.capitalize }
puts s
Hello, World
浙公网安备 33010602011771号