在正则表达式或语法令牌中捕获嵌套结构中的内容

杰梅洛:

我想捕捉一下嵌套结构的内部

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 );
}

由于捕获分组或捕获标记似乎都不起作用,除非它是动态分配给变量的。但是,这会创建一个我确实要避免的附加令牌。所以有两个问题

  • 使捕获标记在嵌套结构中起作用的正确方法是什么?
  • 有没有一种方法可以使用捕获组或捕获标记中的标记来获取嵌套结构的内部?
raiph:

一种解决两个问题的方法

  • 根据ugexe的评论,[...]分组构造适用于所有用例。

  • <()>这样他们就不会工作,与正则表达式捕获标记不分组构造~操作,除非他们分组。

  • 棘轮生效(...)捕获/分组构造会将节俭匹配限制到其最小匹配像这样的模式永远不会匹配多个字符。:r (.+?)

上面最后两个要点中描述的行为不是很明显,不是在文档中,不是按设计文档,可能是烤孔,或者是我的想像力等等。答案的其余部分解释了我对以上三种情况的发现,并讨论了一些可以做的事情。

Glib的解释,好像都是完美的

<(并且)>捕获标记

它们表现为零宽度断言。每个都断言“这标记了我要捕获的包含该标记的正则表达式的开始/结束位置”。


根据正则表达式~运算符的文档

它主要忽略左引数,并在接下来的两个[引数]中操作

(医生在我写“论据”的地方说“原子”。实际上,它作用于接下来的两个原子或组。)

在正则表达式模式中"(" ~ ")" <(\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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章