如何用双反斜杠替换反斜杠?

时间:2011-06-02 01:28:35

标签: ruby string replace backslash

我正在尝试用两个反斜杠替换我的字符串中的反斜杠:

str.gsub!("\\", "\\\\")

但是,它没有做任何事情。我很困惑......

1 个答案:

答案 0 :(得分:16)

  

请注意,这个答案是红宝石1.9的回答。作为红宝石   2.0有一个新的正则表达式引擎,它在这种情况下可能无效。

这有效:

str.gsub!("\\", "\\\\\\") 
str.gsub!("\\", "\\\\\\\\") # also, will always work

编辑:解释(通过@vache提供的http://www.ruby-forum.com/topic/143645

免责声明:我不熟悉ruby的正则表达式引擎的内部工作原理,这里的任何信息都是从上面提到的文章中扣除的。

要知道的基本事情是替换字符串被评估2次。

第一次斜杠在字符串中作为转义执行工作,第二次gsub将在字符串中搜索组引用。

正如@ chris-johnsen所提到的,6个斜杠并不总是有效。这让我相信这样的事情正在发生:

6个斜杠。将3个斜杠传递给组参考图层。尾部斜杠不会被解释为转义字符,因为它后面没有任何内容,它被解释为反斜杠。所以最后这个图层返回2个斜杠。如果有任何内容落后于它,则表达式将失败,因为第三个斜杠现在将用作转义字符。

对于8个斜杠:将4个斜杠传递给组参考图层。这四个斜线将减少到两个。