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

msl12 · October 29, 2016 · Last by gihnius replied at October 30, 2016 · 2021 hits
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 可以用。
You need to Sign in before reply, if you don't have an account, please Sign up first.