当前位置: 首页 > 知识库问答 >
问题:

Perl 6中文本正则表达式中的重复元素及其交替

公西修文
2023-03-14

处理正则表达式中重复的最佳方法是什么,如abc | cde | abc | cde | cde | abc或

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

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)的结尾是相同的,但为了清晰起见,将它们都放在标记中更方便(在我的实际数据中,拐点范式要复杂得多,很容易丢失)。标记结束符按预期工作,但我知道如果我只放一次,程序会运行得更快一些(我用由许多重复元素组成的正则表达式进行了测试,是的,性能会受到很大影响)。根据我的数据,有很多这样的重复,所以我想知道什么是最好的治疗方法?

当然,我可以将结尾放在语法之外的数组中,使这个数组成为代码。唯一,然后只需传递值:

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

但是从语法中取出数据会使其不太清楚。此外,在某些情况下,可能有必要将每个结尾都设为单独的标记(标记结尾{


共有1个答案

凤伟泽
2023-03-14

如果我理解你的意思,为了清楚起见,你想用注释重复regex术语,说明它是一个单独的概念?只需将这行注释掉。

顺便说一下,由于在这种情况下会忽略空正则表达式,所以可以用分支操作符开始这一行,而不是把它放在末尾。它使事情变得更简单,尤其是当您需要添加和删除行时。所以我建议如下:

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

因为你写的东西是专门为人类而不是为解析器而写的。现在,如果您想使用不同的正则表达式进行不同的解析匹配,那么您可以访问结尾$

 类似资料:
  • 谁能提供提取第2个和第3个之间的数据的正则表达式吗 例如,对于下面的数据 2016年度1.1-12.31 COH(NP)#21485 结果应为COH(NP)

  • Perl6正则表达式匹配连接 它为False,因为连词中的“23”与$a中的“23”子字符串匹配,但此子字符串与连词中的“ef”不匹配。这有点违反直觉,因为它更容易解释$a ~~ m/23 如果我有n个正则表达式,我想看看是否所有这些n个正则表达式都匹配相同的整个字符串,而不是匹配整个字符串的相同子字符串部分,那么编写perl6表达式的最佳方法是什么? 在例子中,我真的想做 如果正则表达式的数量很

  • 我正在尝试使用扩展正则表达式(例如使用 )匹配 和 之间的内容。 考虑两个示例字符串和,我尝试了以下正则表达式 但它匹配两个示例的整个字符串(贪婪)。 谁能解释一下正则表达式引擎在这种情况下是如何工作的,以及我应该如何更改我的正则表达式以使其正常工作。

  • 如何在不包含连续子字符串baa的字母表{a,b,c}上表达正则表达式?