s = "#main= 'quotes'
s.gsub "'", "\\'" # => "#main= quotes'quotes"
这似乎是错的,我希望得到 "#main= \\'quotes\\'"
当我不使用转义字符时,它按预期工作 .
s.gsub "'", "*" # => "#main= *quotes*"
所以必须与逃避有关 .
使用ruby 1.9.2p290
我需要用反斜杠和引号替换单引号 .
更多的不一致:
"\\'".length # => 2
"\\*".length # => 2
# As expected
"'".gsub("'", "\\*").length # => 2
"'a'".gsub("'", "\\*") # => "\\*a\\*" (length==5)
# WTF next:
"'".gsub("'", "\\'").length # => 0
# Doubling the content?
"'a'".gsub("'", "\\'") # => "a'a" (length==3)
这里发生了什么?
3 回答
你被' inside a regular expression replacement string的特殊性绊倒了:
所以当你说
"\\'"
时,双\\
变成一个反斜杠,结果是\'
但这意味着"The string to the right of the last successful match."如果你想用单引号替换单引号,你需要逃避更多以超越\'
的特殊性:或者避免牙签并使用块形式:
如果你试图逃避反引号,加号或甚至一个数字,你会遇到类似的问题 .
这里的总体教训是,除了最微不足道的替换之外,更喜欢block form of gsub .
你还需要逃脱\:
输出
在外部论坛上发现一个很好的解释:
source
因为
\
它是\\
等价的,如果你想得到一个双反斜杠你必须放四个 .