str = '\a\b' # 想把每一个斜杠改成两个斜杠,于是.. str.gsub(/\\/, '\\\\') # 结果在irb显示为 \a\b # 没有改变..?改成下面这样的话.. str.gsub(/\\/, '\\\\\\\\') # 结果在irb显示为 \\a\\b # 却成了..
么需要八个斜杠,这是为什么?
应该是 backreference 造成的,复杂替换建议用代码块形式 str.gsub(/\\/) { '\\\\' }
str.gsub(/\\/) { '\\\\' }
简单说就是单双引号对转义符 '\' 的解释问题。
ruby 里返回字符串都是以双引号包着的。
你 puts str.gsub(/\\/, '\\\\\\\\') 才能看到真相。
puts str.gsub(/\\/, '\\\\\\\\')
启发:
'\a\b' == "\a\b" 'a'.bytes '\a'.bytes "\a".bytes
#2 楼 @gihnius 可是'\\' == "\\"是正确的呀
'\\' == "\\"
#3 楼 @msl12 这个是基础,定死的
'\'' == "\'" '\\' == "\\"
#4 楼 @gihnius 为啥用#1 楼的代码块却可以了呢?
#5 楼 @msl12 这个 #1 楼 不是说了嘛,因为 back-reference 呀。
str.gsub(/\\/, '\\\\\\\\') # gsub 把 MatchData 存放到 \&, \1, \' 这些 back-reference 里面 str.gsub(/\\/) { '\\\\' } # 在 block 里就要自己处理 MatchData, 没有 back-reference 可以用。