我将字符串与正则表达式匹配:
s = "`` `foo`"
r = /(?<backticks>`+)(?<inline>.+)\g<backticks>/
我得到了:
s =~ r
$& # => "`` `foo`"
$~[:backticks] # => "`"
$~[:inline] # => " `foo"
为什么$~[:inline]
不是"` `foo"
?由于$&
是s
,我希望:
$~[:backticks] + $~[:inline] + $~[:backticks]
是s
,但事实并非如此,一次反击就消失了。反击哪里去了?
答案 0 :(得分:3)
实际上是预期的。看:
djng
- 匹配1+反引号,并将它们存储在指定的捕获组中#34;反引号&#34; (有两个反引号)。然后... (?<backticks>`+)
- 除了换行符之外的1个以上字符会匹配到&#34;内联&#34;命名捕获组。它抓取所有的字符串和回溯,以便为递归的子模式产生字符,这实际上是&#34;反引号&#34;捕获组。所以,... (?<inline>.+)
- 找到位于字符串末尾的1个反引号。它满足匹配1+反引号的条件。 命名捕获&#34;反击&#34;缓冲区在这里重写。 匹配的工作原理如下:
\g<backticks>
然后1变为3,因为1和3是同一组,你会看到一个反击。