gsub中的Ruby反向引用工作不正常

gsub中的Ruby反向引用工作不正常,ruby,regex,Ruby,Regex,我对以下结果感到困惑 我有这样一个字符串:- string = "hai\"hello\!tst\`\~end" 当我在反斜杠和反引用(\1)之间使用空格时,它工作正常 puts string.gsub(/([\"\!\`\~])/,'\\ \1') => hai\ "hello\ !tst\ `\ ~end 但是没有空间,同样的东西也不能工作!该字符串将替换为反向引用编号 puts string.gsub(/([\"\!\`\~])/,'\\\1') => hai\1hello

我对以下结果感到困惑

我有这样一个字符串:-

string = "hai\"hello\!tst\`\~end"
当我在反斜杠和反引用(\1)之间使用空格时,它工作正常

puts string.gsub(/([\"\!\`\~])/,'\\ \1')
=> hai\ "hello\ !tst\ `\ ~end
但是没有空间,同样的东西也不能工作!该字符串将替换为反向引用编号

puts string.gsub(/([\"\!\`\~])/,'\\\1')
=> hai\1hello\1tst\1\1end
但我期待着这样的回答

=> hai\"hello\!tst\`\~end

如果你需要更多信息,请告诉我。提前感谢。

您需要的是更多的反斜杠:

string = "hai\"hello\!tst\`\~end"

puts string.gsub(/([\"\!\`\~])/,'\\\\\1')
# >> hai\"hello\!tst\`\~end

gsub
的secont参数执行两步处理,使
\\\1
变成
\\1
变成literal
\1
。由于有五个反斜杠,前四个反斜杠减少为一个,
\1
转义序列是完整的,可以替换。

当使用字符类时,您不必转义字符:只需写[“!`~”。您能更详细地描述一下为什么我们需要更多反斜杠吗?当然可以了:)