我正在尝试使用String#gsub在%或?前添加斜杠,然后我将在LIKE查询中使用它。我有一些奇怪的行为,希望有人可以解释:
irb(main):018:0> "%?".gsub(/([%\?])/, '\1')
=> "%?"
irb(main):019:0> "%?".gsub(/([%\?])/, '\\1')
=> "%?"
irb(main):020:0> "%?".gsub(/([%\?])/, '\\\1')
=> "\\1\\1"
irb(main):021:0> "%?".gsub(/([%\?])/, '\\\\1')
=> "\\1\\1"
我目前只是使用字符串做两个单独的gsubs来解决这个问题,但我很想知道是否有人可以解释发生了什么!
答案 0 :(得分:2)
你停止了一个目标:)
>> '%?'.gsub(/([%\?])/, '\\\\\1')
=> "\\%\\?"
Single-quoted strings in Ruby不接受转义字符,因此'\1'
和'\\1'
的解析方式与'\\\1'
和'\\\\1'
相同。你想传递gsub一个\\\1
的参数(三个反斜杠),所以需要五个(实际上是六个)文字反斜杠才能把它写成一个字符串文字。
这可能是使用双引号字符串不容易出错的情况。