Ruby on rails 为什么String#gsub的内容会加倍?
这似乎是错误的,我希望得到Ruby on rails 为什么String#gsub的内容会加倍?,ruby-on-rails,ruby,regex,gsub,Ruby On Rails,Ruby,Regex,Gsub,这似乎是错误的,我希望得到“#main=\\\'quotes\\'” 当我不使用escape char时,它就会按预期工作 s = "#main= 'quotes' s.gsub "'", "\\'" # => "#main= quotes'quotes" 所以这一定与逃跑有关 使用ruby 1.9.2p290 我需要用反斜杠和引号替换单引号 甚至更多的矛盾: s.gsub "'", "*" # => "#main= *quotes*" 这是怎么回事 "\\'".length #
“#main=\\\'quotes\\'”
当我不使用escape char时,它就会按预期工作
s = "#main= 'quotes'
s.gsub "'", "\\'" # => "#main= quotes'quotes"
所以这一定与逃跑有关
使用ruby 1.9.2p290
我需要用反斜杠和引号替换单引号
甚至更多的矛盾:
s.gsub "'", "*" # => "#main= *quotes*"
这是怎么回事
"\\'".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)
由于
\
它是\
等效的,如果你想得到一个双反斜杠,你必须放四个一。你还需要逃出\的限制:
s = "#main = 'quotes'
s.gsub "'", "\\\\'"
输出
s.gsub "'", "\\\\'"
在外部论坛上可以找到一个很好的解释:
理解IMHO的关键是反斜杠在
替换字符串。所以,无论何时,只要你想要一个文字
替换字符串中的反斜杠需要转义,因此
有[两]个反斜杠。巧合的是,反斜杠在图形中也很特殊
字符串(即使在单个带引号的字符串中)。所以你需要两个层次的
转义,在屏幕上为一个文本做2*2=4个反斜杠
替换反斜杠
你会被以下的特殊性绊倒:
\0
,\1
,\2
<代码>\9,\&
,\`
,\'
,\+
替换第n个分组子表达式匹配的值,或替换整个匹配、匹配前或匹配后或最高组匹配的值 所以当你说
“\\'”
时,双引号\
变成了一个反斜杠,结果是\'
,但这意味着“最后一次成功匹配的右边的字符串”。如果你想用转义单引号替换单引号,你需要转义更多,以克服\
的特殊性:
"#main= \\'quotes\\'"
或避免使用牙签,并使用块状:
s.gsub("'", "\\\\'")
如果您试图避开反勾号、加号,甚至是一个数字,您也会遇到类似的问题
这里的整体经验是,除了最简单的替换之外,更喜欢使用字符串。但是它已经被转义了-字符串
“\\”
应该返回一个斜杠。因此,“\\'”
返回长度等于2的字符串:第一个是斜杠,第二个是引号。在gsub中它是混乱的,因为它将内容加倍(为什么?)。此外,.gsub(“'”,“\\*”)
按预期工作,这甚至更加不一致。问题是在正则表达式替换中,这一有点模糊的功能主要是出于历史原因。我不想要双反斜杠-只有一个。这就是为什么我避开一个斜杠并加上引号。“\\\”。长度==2
,这是正确的gsub
通过将内容翻倍而出错。非常感谢。它肯定会把事情弄清楚。我只是想知道替换是什么意思?我记不起来我在任何地方都见过它们。@Dmytrii:查看它们的全局变量版本可能会有所帮助()。我不知道有什么好的权威在线参考Ruby的正则表达式。我必须把[ruby][gsub]标签组合起来,然后再看看“FAQ”标签。@安德鲁:谢谢图书管理员的工作。
s.gsub("'") { |m| '\\' + m }