gsub有一些替代品,只是将一个字符串的出现替换为另一个字符串?
根据文档“如果替换是一个字符串,它将替换匹配的文本。它可能包含对格式\ d的模式捕获组的反向引用,其中d是一个组号,或者\ k,其中n是一个组名。“
我不想要这个功能..
简化示例:
"abc".gsub("b", "\\7") -> "ac"
我希望"a\7c"
..
问题是来自用户的替换字符串(实际上它是一个包含"xxx\7.0\yyy"
的路径),如果它是一个简单的固定字符串我可以自己逃避它。
我知道这很有用:"abc".gsub("b") { |x| "\\\7" }
..但是,如果要学习到目前为止我要相信那些美丽的语言,我应该有一个简单的替代方案,我会在文档中忽略它。
答案 0 :(得分:6)
您可以使用(编辑:不可以)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
答案 1 :(得分: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