我将字符串与正则表达式匹配:
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是同一组,所以你会看到一个倒勾。