如何在gsub替换字符串中转义反向引用

时间:2012-06-18 06:22:32

标签: ruby

gsub有一些替代品,只是将一个字符串的出现替换为另一个字符串?

根据文档“如果替换是一个字符串,它将替换匹配的文本。它可能包含对格式\ d的模式捕获组的反向引用,其中d是一个组号,或者\ k,其中n是一个组名。“

我不想要这个功能..

简化示例:

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

我希望"a\7c" ..

问题是来自用户的替换字符串(实际上它是一个包含"xxx\7.0\yyy"的路径),如果它是一个简单的固定字符串我可以自己逃避它。

我知道这很有用:"abc".gsub("b") { |x| "\\\7" } ..但是,如果要学习到目前为止我要相信那些美丽的语言,我应该有一个简单的替代方案,我会在文档中忽略它。

2 个答案:

答案 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