所以,我有
puts "test\\nstring".gsub(/\\n/, "\n")
并且有效。
但是,如何编写一个语句来替换正确转义的对应项的\ n,\ r和\ t?
答案 0 :(得分:3)
您必须使用反向引用。尝试
puts "test\\nstring".gsub(/(\\[nrt])/, $1)
gsub将$n
(其中'n'是正则表达式中相应组的编号)添加到与模式匹配的内容中。
修改强> 我修改了正则表达式,现在输出应该是:
test\nstring
\n
不会被put作为换行符。
答案 1 :(得分:2)
这些不是转义字符,这些是仅表示为转义的文字字符,因此它们是人类可读的。你需要做的是:
escapes = {
'n' => "\n",
'r' => "\r",
't' => "\t"
}
"test\\nstring".gsub(/\\([nrt])/) { escapes[$1] }
# => "test\nstring"
您必须根据需要添加其他转义字符,如果您确实需要解释它们,这仍然无法容纳一些较为模糊的转义字符。一个潜在危险但非常简单的解决方案就是评估它:
eval("test\\nstring")
只要您可以确信您的输入流不包含允许注入任意Ruby的#{ ... }
之类的内容,如果这是修复某些损坏的编码的一次修复,则可能没事。
<强>更新强>
对于这些反斜杠的含义可能存在误解。这是一个例子:
"\n".bytes.to_a
# => [10]
"\\n".bytes.to_a
# => [92, 110]
你可以看到这些是完全不同的两件事。 \n
表示ASCII字符10,换行符。
答案 2 :(得分:1)
通过@tadman和@black的帮助,我发现了解决方案:
>> escapes = {'\\n' => "\n", '\\t' => "\t"}
=> {"\\t"=>"\t", "\\n"=>"\n"}
>> "test\\nstri\\tng".gsub(/\\([nrt])/) { |s| escapes[s] }
=> "test\nstri\tng"
>> puts "test\\nstri\\tng".gsub(/\\([nrt])/) { |s| escapes[s] }
test
stri ng
=> nil
事实证明,你只是将\\映射到\并且一切都很好。此外,您需要使用puts为终端正确输出空格。
escapes = {'\\n' => "\n", '\\t' => "\t"}
puts "test\\nstri\\tng".gsub(/\\([nrt])/) { |s| escapes[s] }