2011-07-11 29 views

回答

2

这些不是转义字符,它们是仅表示为转义的文字字符,因此它们是人类可读的。什么,你需要做的是这样的:

escapes = { 
    'n' => "\n", 
    'r' => "\r", 
    't' => "\t" 
} 

"test\\nstring".gsub(/\\([nrt])/) { escapes[$1] } 
# => "test\nstring" 

你必须按要求,这仍然不能满足一些比较模糊的人,如果你真的需要理解他们都添加其他转义字符。有潜在危险,但非常简单的解决方法就是EVAL它:

eval("test\\nstring") 

只要你可以放心,你的输入流不包含之类的东西#{ ... },将允许注入任意红宝石,这是可能的,如果这是修复一些损坏的编码的一次性修复,这将是很好的。

更新

可能有误的理解,什么这些反斜线。这里有一个例子:

"\n".bytes.to_a 
# => [10] 

"\\n".bytes.to_a 
# => [92, 110] 

你可以看到这些是两个完全不同的东西。 \n是ASCII字符10,一个换行符的表示形式。

+0

结果....“test \\ nstring”看起来有问题。gsub(/ \\([ntr])/){| s |越狱[s] [1]]} #=>“testn \ nstring” –

+0

是的,我搞砸了我的剪切和粘贴。那里有一个错误。 – tadman

+0

这只是删除\\?字符... = \ – NullVoxPopuli

3

您必须使用反向引用。尝试

puts "test\\nstring".gsub(/(\\[nrt])/, $1) 

GSUB设置$n(其中“n”是在所使用的正则表达式的对应的组的数目)对内容相匹配的图案。

编辑: 我修改了正则表达式,现在输出应该是:

test\nstring 

\n不会intepreted由看跌期权换行符。

+0

美元符号不工作= \我得到这个(当我复制粘贴):测试$ 1stri $为1ng – NullVoxPopuli

+0

这并不做任何有用的。结果是'test $ 1string'。 – tadman

+1

这仍然没有用处。你不能像这样使用'$ 1',它必须在一个块内执行。当你使用这样的数据时,你应该总是使用'puts'和'inspect'来查看正在生成的实际字符串。 – tadman

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