我正在生成一些RTF字符串,需要\'bd代码。我对sub和gsub命令有问题。
puts 'abc'.sub('a',"\'B") => "bcBbc"
该语句将目标替换为不带\的"B",并将字符串的其余部分复制到前面。我尝试了很多变体,似乎问题出在"本身。
我有办法解决这个问题,但我想知道我是否做错了什么,或者这是否是Ruby的怪癖。
感谢
来自Ruby文档:
类似地,&
、'
、`
和+
分别对应于特殊变量$&
、$'
、$`
和$+
。
在这里,文档继续说:
$~
等价于::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"
。
因此,与其得到'Bbc
,不如得到bcBbc
因此,不幸的是,在这种奇怪的情况下,您需要双-转义反斜杠:
puts 'abc'.sub('a',"\\'B") => "'Bbc"