【发布时间】:2020-04-20 16:23:19
【问题描述】:
我正在生成一些 RTF 字符串并且需要 \'bd 代码。我遇到了 sub 和 gsub 命令的问题。
puts 'abc'.sub('a',"\\'B") => "bcBbc"
该语句用不带 \' 的 'B' 替换目标,并将字符串的其余部分复制到前面。我尝试了很多变体,似乎问题出在 \' 本身。
我有办法解决这个问题,但我想知道我是否做错了什么,或者这是否是 Ruby 的一个怪癖。
谢谢
【问题讨论】:
我正在生成一些 RTF 字符串并且需要 \'bd 代码。我遇到了 sub 和 gsub 命令的问题。
puts 'abc'.sub('a',"\\'B") => "bcBbc"
该语句用不带 \' 的 'B' 替换目标,并将字符串的其余部分复制到前面。我尝试了很多变体,似乎问题出在 \' 本身。
我有办法解决这个问题,但我想知道我是否做错了什么,或者这是否是 Ruby 的一个怪癖。
谢谢
【问题讨论】:
同样,
\&、\'、\`、\+分别对应特殊变量$&、$'、$`、$+。
还有here,文档接着说:
$~等价于::last_match;$&包含完整匹配的文本;$`包含匹配前的字符串;$'包含匹配后的字符串;$1、$2等包含文本匹配第一、第二等捕获组;$+包含最后一个捕获组。例子:
m = /s(\w{2}).*(c)/.match('haystack') #=> #<MatchData "stac" 1:"ta" 2:"c"> $~ #=> #<MatchData "stac" 1:"ta" 2:"c"> Regexp.last_match #=> #<MatchData "stac" 1:"ta" 2:"c"> $& #=> "stac" # same as m[0] $` #=> "hay" # same as m.pre_match $' #=> "k" # same as m.post_match $1 #=> "ta" # same as m[1] $2 #=> "c" # same as m[2] $3 #=> nil # no third group in pattern $+ #=> "c" # same as m[-1]
因此,替换替换字符串中的\' 具有特殊含义。它的意思是“匹配后的原始字符串部分”——在本例中为"bc"。
所以你得到bcBbc而不是\'Bbc
因此,不幸的是,在这种奇怪的情况下,您需要 double-转义反斜杠:
puts 'abc'.sub('a',"\\\\'B") => "\'Bbc"
【讨论】: