2013-05-28 72 views
1

简单的问题反斜杠,但我无法找到一个简单的答案红宝石:替换字符串符号与符号

我有一个字符串

str = 'a&b' 

我需要更换&到\ &

str 
>>> a\&b 

在php中,我可以这样做

str_replace('&', '\\&', $str); \\ >>> a\&b 

但在红宝石此使用块不工作

str.gsub('&', '\\&') 
>>> a&b 

回答

4
2.0.0-p0 :018 > "a&b".gsub('&', '\\\&') 
=> "a\\&b" 
2.0.0-p0 :019 > _.chars.to_a 
=> ["a", "\\", "&", "b"] 
2.0.0-p0 :023 > puts "a&b".gsub('&', '\\\&') 
a\&b 
+0

我不需要两个反斜杠,我需要一个反斜杠。而不是\\&b我需要一个\&b – redexp

+1

这不是两个反斜杠。这是一个反斜杠。 – DNNX

+1

这是因为Irb显示*转义*字符串。 – SirDarius

3

A液:

> puts 'a&b'.gsub('&') { '\&' } 
a\&b 

在块形式,\前缀反向引用不被解释,就是这种情况在更换参数gsub

在块形式中,有$ n,$ & ...变量可用。

以您使用的gsub的形式,双反斜杠必须用另一个反斜杠进行转义。

+2

你有没有需要的块参数。它将打印无需变量的警告。上帝的方式是'a&b'.gsub('&'){| _ | ''&'}',更好的方法是''a&b'.gsub('&'){'\&'}',最好的方法是@DNNX提出的方法:''a&b'.gsub('&' ,'\\\&')' – Hauleth

+0

是的,修复了参数。另一种解决方案如何是“最好的”?请详细说明你的论点:) – SirDarius

+0

在你的版本中有每一次有'&'找到时都必须调用的块。在另一种解决方案中,不需要调用其他功能。我们在那里得到了我们的替换,我们可以在一个C函数中替换instatnt中的每个命中(我不记得YARV存储返回值,即使这样做,每次运行时阻止接收不同的参数)。所以'最好'的饮料只是最快的一个。 – Hauleth