角色去哪儿了?
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 是同一组,所以你看到一个反引号。
我将字符串与正则表达式进行了匹配:
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 是同一组,所以你看到一个反引号。