新手问题 用 gsub 把'\'变换为'\\'的问题

msl12 · 2016年10月29日 · 最后由 gihnius 回复于 2016年10月30日 · 2084 次阅读
str =  '\a\b'
# 想把每一个斜杠改成两个斜杠,于是..
str.gsub(/\\/, '\\\\')
# 结果在irb显示为 \a\b
# 没有改变..?改成下面这样的话..
str.gsub(/\\/, '\\\\\\\\')
# 结果在irb显示为 \\a\\b
# 却成了..

么需要八个斜杠,这是为什么? 😓

应该是 backreference 造成的,复杂替换建议用代码块形式 str.gsub(/\\/) { '\\\\' }

简单说就是单双引号对转义符 '\' 的解释问题。

ruby 里返回字符串都是以双引号包着的。

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 可以用。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号