24

我正在尝试用两个反斜杠替换字符串中的反斜杠,如下所示:

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

但是,它什么也没做。我很困惑...

4

1 回答 1

21

请注意,这个答案是在 ruby​​ 1.9 中给出的。由于 ruby​​ 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 个斜线被传递到组参考层。四个斜线将依次减少到两个。

于 2011-06-02T01:36:42.407 回答