【问题标题】:Non-regexp version of gsub in RubyRuby 中 gsub 的非正则表达式版本
【发布时间】:2013-03-28 11:58:15
【问题描述】:

我正在寻找gsub 的一个版本,它不会尝试将其输入解释为正则表达式,而是使用普通的类似 C 的转义字符串。

更新

这个问题是由一个奇怪的行为引发的:

text.gsub("pattern", "\\\\\\")

text.gsub("pattern", "\\\\\\\\")

被视为相同,并且

text.gsub("pattern", "\\\\")

被视为单个反斜杠。

【问题讨论】:

    标签: ruby-on-rails regex replace gsub


    【解决方案1】:

    gsub的第二个参数有两层转义:

    第一层是 Ruby 字符串常量。如果它是像\\\\\\ 这样写的,它不会像\\\那样被Ruby 转义

    第二层是 gsub 本身:\\\ 被视为 \\ + \

    双反斜杠被解析为单反斜杠:\\ => \ 并且末尾的单个尾随反斜杠被解析为自身。

    8 个反斜杠的解析方式类似:

    "\\\\\\\\" => "\\\\"
    

    然后

    "\\\\" => "\\"
    

    所以由六个和八个反斜杠组成的常量被解析为两个反斜杠。

    为了让生活更轻松,可以在 gsub 函数中使用块。块中的字符串常量仅通过 Ruby 层传递(感谢@Sorrow)。

    "foo\\bar".gsub("\\") {"\\\\"}
    

    【讨论】:

      【解决方案2】:

      gsub 接受字符串作为第一个参数:

      the pattern is typically a Regexp; if given as
      a String, any regular expression metacharacters
      it contains will be interpreted literally
      

      例子:

      "hello world, i am thy code".gsub("o", "-foo-")
      => "hell-foo- w-foo-rld, i am thy c-foo-de"
      

      【讨论】:

      • 那为什么要替换成两个反斜杠\\我必须写六个反斜杠? "\\\\\\" 见这里:stackoverflow.com/questions/1542214/…
      • 不太清楚你的意思..."foo\\\\bar".gsub("\\\\", "-") 会产生"foo-bar"(也可以是"foo\\\\bar".count('\\') == 2),只要您对字符串进行操作,也就是说...如果您执行其他操作解决方法(用两个 \s 替换某些东西)- 答案在您链接的线程中(可怕的细节;);出于这个原因(以及其他清晰的原因),我建议您使用 gsub 的块语法而不是两个参数
      • 尝试将单反斜杠替换为双反斜杠,你会看到。
      • 是的,当你为 gsub 使用两个参数时它不起作用,但当你使用块调用时它起作用:"foo\\bar".gsub("\\") {"\\\\"}
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      相关资源
      最近更新 更多