【发布时间】:2011-09-06 18:12:36
【问题描述】:
我正在尝试用两个反斜杠替换字符串中的反斜杠,如下所示:
str.gsub!("\\", "\\\\")
但是,它什么也没做。我很困惑……
【问题讨论】:
标签: ruby string replace backslash
我正在尝试用两个反斜杠替换字符串中的反斜杠,如下所示:
str.gsub!("\\", "\\\\")
但是,它什么也没做。我很困惑……
【问题讨论】:
标签: ruby string replace backslash
请注意,这个答案是在 ruby 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 个斜线被传递到组参考层。四个斜线将依次减少为两个。
【讨论】:
&、'、`、1–9 、+ 或 k<name>(与号、单引号、反引号、非零数字、加号或命名捕获)。