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

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

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

为什么$~[:inline]不是"` `foo"?因为$&s,我希望:
$~[:backticks] + $~[:inline] + $~[:backticks]

要成为s,但不是,一个backtick消失了。回音去哪儿了?

最佳答案

这是意料之中的事。看:
(?<backticks>`+)-匹配1+个backticks并将它们存储在命名的捕获组“backticks”(有两个backticks)中。然后…
(?<inline>.+)-1+新行以外的字符将匹配到名为“inline”的捕获组中。它捕获所有字符串和回溯,以将字符赋给递归子模式,该子模式实际上是“回溯”捕获组。所以,…
\g<backticks>-查找字符串末尾的1个倒勾。它满足匹配1+反勾的条件。在此重新写入命名的捕获“backtick”缓冲区。
匹配的工作方式如下:

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

然后1变成3,因为1和3是同一组,所以你会看到一个倒勾。

07-22 21:30