Ruby Regexp:如何用\ n替换双重转义字符,例如\\ n.

时间:2011-07-11 15:30:55

标签: ruby regex

所以,我有

puts "test\\nstring".gsub(/\\n/, "\n")

并且有效。

但是,如何编写一个语句来替换正确转义的对应项的\ n,\ r和\ t?

3 个答案:

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