角色去了哪里?

时间:2016-04-27 14:26:17

标签: ruby regex onigmo

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

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

我得到了:

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

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

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

s,但事实并非如此,一次反击就消失了。反击哪里去了?

1 个答案:

答案 0 :(得分:3)

实际上是预期的。看:

  • djng - 匹配1+反引号,并将它们存储在指定的捕获组中#34;反引号&#34; (有两个反引号)。然后...
  • (?<backticks>`+) - 除了换行符之外的1个以上字符会匹配到&#34;内联&#34;命名捕获组。它抓取所有的字符串和回溯,以便为递归的子模式产生字符,这实际上是&#34;反引号&#34;捕获组。所以,...
  • (?<inline>.+) - 找到位于字符串末尾的1个反引号。它满足匹配1+反引号的条件。 命名捕获&#34;反击&#34;缓冲区在这里重写。

匹配的工作原理如下:

\g<backticks>

然后1变为3,因为1和3是同一组,你会看到一个反击。