角色去哪儿了?

Where did the character go?

我将字符串与正则表达式进行了匹配:

s = "`` `foo`"
r = /(?<backticks>`+)(?<inline>.+)\g<backticks>/

我得到了:

s =~ r
$&             # => "`` `foo`"
$~[:backticks] # => "`"
$~[:inline]    # => " `foo"

为什么 $~[:inline] 不是 "` `foo"?由于 $&s,我预计:

$~[:backticks] + $~[:inline] + $~[:backticks]

s,但不是,一个反引号没了。反引号哪里去了?

其实也在意料之中。看:

  • (?<backticks>`+) - 匹配 1+ 个反引号并将它们存储在命名的捕获组 "backticks" 中(有两个反引号)。那么...
  • (?<inline>.+) - 除换行符外的 1+ 个字符匹配到 "inline" 命名捕获组中。它获取所有字符串并回溯以将字符生成到实际上是 "backticks" 捕获组的递归子模式。所以,...
  • \g<backticks> - 查找字符串末尾的 1 个反引号。它满足匹配 1+ 个反引号的条件。 此处重写了命名捕获 "backtick" 缓冲区。

匹配是这样的:

"`` `foo`"
 ||1
   | 2 |
       |3

然后 1 变成 3,因为 1 和 3 是同一组,所以你看到一个反引号。