【问题标题】:Replace ' with \' in Ruby?在Ruby中用\'替换'?
【发布时间】:2011-01-17 00:32:23
【问题描述】:

我正在尝试弄清楚如何将 ' 之类的引用替换为 \' 之类的内容。

我该怎么做?

我试过了

"'".gsub("'","\\'")

但它只是给出一个空字符串。我在这里做错了什么?

【问题讨论】:

  • 我希望你不要试图逃避 SQL 输入。始终“准备”您的陈述。
  • 不是,是转义码,不是SQL。

标签: ruby string gsub


【解决方案1】:

这个怎么样

puts "'".gsub("'","\\\\'")
\'

原因是 \' 在 gsub(正则表达式)中表示 post-match,因此需要使用 \\' 进行转义,而 \ 显然被转义为 \\ ,以\\\\'结尾。

例子

>> "abcd".gsub("a","\\'")
=> "bcdbcd"

aa 之后的所有内容替换。

【讨论】:

  • 感谢您为我解释这一点。我猜 gsub 只是有一些隐藏的“功能”
【解决方案2】:

$' 变量是匹配项右侧的字符串。在gsub 替换字符串中,相同的变量将是\'——因此出现了问题。

x = "'foo'"
x.gsub!(/'/, "\\'")
puts x.inspect        # foo'foo

这应该可行:

x = "'foo'"
x.gsub!(/'/, "\\\\'")
puts x.inspect
puts x

【讨论】:

    【解决方案3】:

    我实际使用过的两步法...

    BACKSLASH = 92.chr
    temp = "'".gsub("'", "¤'")
    puts temp.gsub("¤", BACKSLASH)
    => "\'"
    

    只有在文本中明显没有使用“¤”时才有效...

    【讨论】:

      【解决方案4】:

      这可能是一个错误。或者至少,它打破了我对最小惊喜原则的想法。

      irb(main):039:0> "life's grand".gsub "'", "\\\'"
      => "lifes grands grand"
      irb(main):040:0> "life's grand".gsub "'", "\\\\'"
      => "life\\'s grand"
      

      【讨论】:

      • 是的,这对我来说没有意义.. 当然我可以使用正则表达式,但这似乎有点矫枉过正。
      【解决方案5】:

      这样做怎么样:

      "'".gsub("\\","\\\\\\\\").gsub("'","\\\\'")
      

      不漂亮,但我认为它有效......

      【讨论】:

      • 破坏性版本也不起作用。只是从 irb 提示符返回一个空白字符串
      • Ruby 版本是ruby 1.8.6 (2009-06-08 patchlevel 369) [x86_64-openbsd4.6]
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多