\\ñ所以,我有红宝石正则表达式:如何更换双转义字符如用 n
puts "test\\nstring".gsub(/\\n/, "\n")
和工程。
但是,我该如何写一条语句来替换\ n,\ r和\ t与他们正确转义的对方?
\\ñ所以,我有红宝石正则表达式:如何更换双转义字符如用 n
puts "test\\nstring".gsub(/\\n/, "\n")
和工程。
但是,我该如何写一条语句来替换\ n,\ r和\ t与他们正确转义的对方?
这些不是转义字符,它们是仅表示为转义的文字字符,因此它们是人类可读的。什么,你需要做的是这样的:
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,一个换行符的表示形式。
您必须使用反向引用。尝试
puts "test\\nstring".gsub(/(\\[nrt])/, $1)
GSUB设置$n
(其中“n”是在所使用的正则表达式的对应的组的数目)对内容相匹配的图案。
编辑: 我修改了正则表达式,现在输出应该是:
test\nstring
的\n
不会intepreted由看跌期权换行符。
美元符号不工作= \我得到这个(当我复制粘贴):测试$ 1stri $为1ng – NullVoxPopuli
这并不做任何有用的。结果是'test $ 1string'。 – tadman
这仍然没有用处。你不能像这样使用'$ 1',它必须在一个块内执行。当你使用这样的数据时,你应该总是使用'puts'和'inspect'来查看正在生成的实际字符串。 – tadman
通过@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] }
结果....“test \\ nstring”看起来有问题。gsub(/ \\([ntr])/){| s |越狱[s] [1]]} #=>“testn \ nstring” –
是的,我搞砸了我的剪切和粘贴。那里有一个错误。 – tadman
这只是删除\\?字符... = \ – NullVoxPopuli