用 \'X 字符串替换时奇怪的 Ruby 行为



我正在生成一些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"

最新更新