3

ある文字列の出現を別の文字列に置き換えるだけのgsubの代替手段はありますか?

docs によると、「置換が文字列の場合、一致したテキストに置き換えられます。\d の形式のパターンのキャプチャ グループへの後方参照が含まれる場合があります。d はグループ番号、または \k は n です。グループ名。"

私はこの機能を望んでいません..

簡単な例:

"abc".gsub("b", "\\7") -> "ac"

そして私は欲しい"a\7c"..

問題は、置換文字列がユーザーから要求されることです(実際には を含むパスです"xxx\7.0\yyy")。単純な固定文字列であれば、自分でエスケープできます。

私はこれが機能することを知ってい"abc".gsub("b") { |x| "\\\7" }ます..しかし、ルビーであることは今まで学ぶべき美しい言語であり、ドキュメントで見落としている簡単な代替手段があるはずです。

4

2 に答える 2

6

( edit : no you can't)を使用Regexp.escapeして、ユーザー提供の文字列をエスケープできます。

user_input = '\7'
puts "abc".gsub("b", Regexp.escape(user_input))
a\7c

それ以外の場合は、二重引用符ではなく一重引用符を使用してエスケープします。

puts "abc".gsub("b", '\\\7')
a\7c

...または二重引用符を使用すると、さらにエスケープする必要があります。

puts "abc".gsub("b", "\\\\7")
a\7c

...またはブロック表記ですが、ブロック変数をスキップできます:

puts "abc".gsub("b") { '\7' }
a\7c
于 2012-06-18T07:49:28.253 に答える
1
$ irb 
irb(main):001:0> replace='xxx\7.0\yyy'
=> "xxx\\7.0\\yyy"
irb(main):002:0> puts  "abc".gsub("b", replace.dump[1..-2])
axxx\7.0\yyyc
=> nil
于 2012-06-18T06:46:32.307 に答える