【问题标题】:How to replace backslash with double backslash?如何用双反斜杠替换反斜杠?
【发布时间】:2011-09-06 18:12:36
【问题描述】:

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

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

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

【问题讨论】:

    标签: ruby string replace backslash


    【解决方案1】:

    请注意,这个答案是在 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 个斜线被传递到组参考层。四个斜线将依次减少为两个。

    【讨论】:

    • 有一个讨论here关于为什么会这样。
    • 如果您添加解释(Vache 的链接很有帮助),我会接受您的回答。我不喜欢接受给出解决方案的答案而不解释为什么它是解决方案。你也能解释一下为什么它可以同时使用 6 个和 8 个反斜杠吗,因为我自己也不太明白...
    • 最好提一下为什么只有六个不工作(在一般情况下)后跟&、'、`、1–9 、+ 或 k<name>(与号、单引号、反引号、非零数字、加号或命名捕获)。
    猜你喜欢
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多