我想捕捉一下嵌套结构的内部。
my $str = "(a)";
say $str ~~ /"(" ~ ")" (\w) /;
say $str ~~ /"(" ~ ")" <(\w)> /;
say $str ~~ /"(" <(~)> ")" \w /;
say $str ~~ /"(" <(~ ")" \w /;
第一个作品;最后一个有效,但也捕获了右括号。另外两个失败,因此在这种情况下无法使用捕获标记。但是在语法方面,这个问题更加复杂,因为捕获组似乎也不起作用,例如:
# Please paste this together with the code above so that it compiles.
grammar G {
token TOP {
'(' ~ ')' $<content> = .+?
}
}
grammar H {
token TOP {
'(' ~ ')' (.+?)
}
}
grammar I {
token TOP {
'(' ~ ')' <( .+? )>
}
}
$str = "(one of us)";
for G,H,I -> $grammar {
say $grammar.parse( $str );
}
由于捕获分组或捕获标记似乎都不起作用,除非它是动态分配给变量的。但是,这会创建一个我确实要避免的附加令牌。所以有两个问题
根据ugexe的评论,[...]
分组构造适用于所有用例。
在<(
和)>
这样他们就不会工作,与正则表达式捕获标记不分组构造~
操作,除非他们分组。
上面最后两个要点中描述的行为不是很明显,不是在文档中,不是按设计文档,可能是烤孔,或者是我的想像力等等。答案的其余部分解释了我对以上三种情况的发现,并讨论了一些可以做的事情。
<(
并且)>
是捕获标记。
它们表现为零宽度断言。每个都断言“这标记了我要捕获的包含该标记的正则表达式的开始/结束位置”。
根据正则表达式~
运算符的文档:
它主要忽略左引数,并在接下来的两个[引数]中操作
(医生在我写“论据”的地方说“原子”。实际上,它作用于接下来的两个原子或组。)
在正则表达式模式中"(" ~ ")" <(\w)>
:
")"
是在之后的第一个原子/基团~
。
<(
是在之后的第二个原子/基团~
。
~
忽略\w)>
。
解决方法是使用[...]
:
say '(a)' ~~ / '(' ~ ')' [ <( \w )> ] /; # 「a」
同样,在语法中:
token TOP { '(' ~ ')' [ <( .+? )> ] }
(...)
分组不是您想要的,这有两个原因:
可能不是您想要的。它将创建一个额外的 令牌 捕获。并且您写了您想要避免这种情况。
即使您想要额外的捕获,也可以(...)
在棘轮有效时使用,以将节俭匹配夹在中间。
我认为文档更新可能是最好的选择。但是,无论谁想提出有关某个问题或准备一份PR的imo,都建议使用以下内容。
是已知的预期行为还是错误?
在GH回购中搜索“捕获标记”:
“捕获标记”一词来自文档,而不是旧的设计文档,它只是说:
一个
<(
令牌表示比赛的整体拍摄开始,而相应的)>
标记表明其端点。匹配后,它们的行为就始终是正确的断言,但具有设置匹配对象的.from
和.to
属性的副作用。
(也许您可以从中找出在问题等中要搜索的字符串...)
在撰写本文时,所有GH都在搜索<(
或)>
绘制空白,但这是由于GH内置的当前搜索功能较弱,而不是因为这些存储库中没有任何内容,例如this。
我很好奇,并尝试这样做:
my $str = "aaa";
say $str ~~ / <(...)>* /;
它无限循环。在*
作用于刚)>
。这证实了捕获标记被视为原子的感觉。
正则表达式~
运算符适用于[...]
和其他一些分组的原子构造。解析其中的任何有开始和结束中一个正则表达式。
捕获标记的不同之处在于它们不一定成对-起始或结束可以是隐式的。
也许这会使我们对Raku感到不合理的困难,因为开始(/
或{
)和结束(/
或}
)发生在语边界,并且Raku是单遍解析辫子?
我认为,文档修复可能是对SO的这一捕获标记方面的适当响应。
如果正则表达式~
是唯一关心左右捕获标记分别是单个原子的正则表达式构建体,那么提及这种皱纹的最佳位置可能就是正则表达式~
部分。
但是,考虑到多个正则表达式构造很重要(量化器按照上述无限循环示例进行),那么最好的地方可能是捕获标记部分。
或者,如果两者都提到,那将是最好的。(尽管那是一个湿滑的斜坡...)
:r (.*?)
“不工作”,该怎么办?我认为文档更新可能是最好的选择。但是,无论谁想提出有关某个问题或准备一份PR的imo,都建议使用以下内容。
是已知的预期行为还是错误?
在GH repos中搜索ratchet frugal
:
“棘齿”和“节俭”这两个术语均来自旧的设计文档,并且仍在最新文档中使用,并且似乎没有别名。因此,对它们的搜索应有望与所有相关提及匹配。
以上搜索是针对两个单词的。一次搜索一个可能会发现重要的相关提及,而恰巧却没有提及另一个。
在撰写本文时,所有GH搜索.*?
或类似的绘制空白,但这是由于当前GH搜索内置的功能较弱,而不是因为这些存储库中没有任何内容。
也许这里的问题比棘轮,节俭和俘虏的结合要广泛得多?
也许用“棘轮”,“节俭”和“捕获”这两个词提出问题?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句