gpt4 book ai didi

raku - Perl 6 中交替出现的文字正则表达式中的重复元素

转载 作者:行者123 更新时间:2023-12-01 06:39:54 26 4
gpt4 key购买 nike

处理 regexes 中重复的最佳方法是什么?喜欢abc | cde | abc | cde | cde | abc<regex1> | <regex2> | <regex3> | <regex4> | <regex5> | <regex6> ,其中很多regexN将是相同的文字?

为了解释我的意思,我将举一个德语的例子。这是一个示例 grammar可以解析多种现在时动词形式。

grammar Verb {
token TOP {
<base>
<ending>
}
token base {
geh |
spiel |
mach
}
token ending {
e | # 1sg
st | # 2sg
t | # 3sg
en | # 1pl
t | # 2pl
en # 3pl
}
}

my @verbs = <gehe spielst machen>;
for @verbs -> $verb {
my $match = Verb.parse($verb);
say $match;
}

1pl 和 3pl 的结尾 (en) 相同,但为了清楚起见,将它们都放在 token 中更方便(在我现实生活中的数据中,屈折范式要复杂得多,而且很容易迷路)。 token ending按预期工作,但我知道如果我把 en只有一次,程序会运行得更快一些(我用 regexes 进行了测试,其中包含许多这样的重复元素,是的,性能受到很大影响)。在我的数据中,有很多这样的重复,所以我想知道处理它们的最佳方法是什么?

当然,我可以将结尾放在 array 中外面grammar , 使这个数组 .unique然后只需传递值:

my @endings = < ... >;
@endings .= unique;
...
token ending { @endings }

但是从 grammar 中取出数据会使它不太清楚。此外,在某些情况下,可能需要使每个结尾都有一个单独的标记 ( token ending {<ending_1sg> | <ending_2sg> ... <ending_3pl>} ,如果它们在 grammar 之外定义,这是不可能的。

最佳答案

如果我理解你的意思,为了清楚起见,你想重复正则表达式术语和描述哪些注释是一个单独概念的注释?只需注释掉该行即可。

顺便说一下,由于在这种情况下会忽略空的正则表达式,因此可以用分支运算符开始该行,而不是将其放在末尾。它使事情变得更容易,尤其是当您需要添加和删除行时。所以我建议这样:

grammar Verb {
# ...
token ending {
| e # 1sg
| st # 2sg
| t # 3sg
| en # 1pl
#| t # 2pl
#| en # 3pl
}
}

因为您正在编写的内容专供人类使用,而不是供解析器使用。现在,如果您想使用不同的正则表达式进入不同的解析匹配,那么您可以访问结尾 $<_3sg>$<_2p1> (命名为正则表达式,所以两者都会成功),你不能把它注释掉,你将不得不强制计算机做额外的工作。显然你需要使用 :exhaustive:overlap .相反,我建议您制作一个代表 3sg 和 2p1 的命名正则表达式,并像我上面那样定义它:将它们都写下来,但注释掉一个。

关于raku - Perl 6 中交替出现的文字正则表达式中的重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47010420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com