【问题标题】:Strange Ruby behavior when replacing with \'X string用 \'X 字符串替换时出现奇怪的 Ruby 行为
【发布时间】:2020-04-20 16:23:19
【问题描述】:

我正在生成一些 RTF 字符串并且需要 \'bd 代码。我遇到了 sub 和 gsub 命令的问题。

puts 'abc'.sub('a',"\\'B")  => "bcBbc"

该语句用不带 \' 的 'B' 替换目标,并将字符串的其余部分复制到前面。我尝试了很多变体,似乎问题出在 \' 本身。

我有办法解决这个问题,但我想知道我是否做错了什么,或者这是否是 Ruby 的一个怪癖。

谢谢

【问题讨论】:

标签: ruby string-substitution


【解决方案1】:

来自the Ruby documentation

同样,\&\'\`\+分别对应特殊变量$&$'$`$+

还有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"

【讨论】:

  • 感谢@3limin4t0r 重新格式化,我不知道如何正确格式化包含反引号的代码!
  • 谢谢你,汤姆!我从来没有想过。
猜你喜欢
  • 2012-08-31
  • 1970-01-01
  • 2014-08-28
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多