【问题标题】:Extending a regex definition without repeating the definition扩展正则表达式定义而不重复定义
【发布时间】:2022-08-20 04:24:16
【问题描述】:

我想知道是否有某种方法可以在不重复内部符号的情况下扩展正则表达式定义。

例如,以下定义都包含在彼此中。是否有任何符号可以从letters 扩展lettersAndNumbers,从lettersAndNumbers 扩展lettersAndNumbersAndUnderscore 等等?

%{
}%
letters                          [A-Za-z]
lettersAndNumbers                [A-Za-z0-9]  /* extension of letters */
lettersAndNumbersAndUnderscore   [A-Za-z0-9_] /* extension of lettersAndNumbers */
%%

我有一些带有更复杂符号和定义的定义,我想删除所有这些重复。

  • 我知道这个问题是关于 flex 的,但是 Perl 扩展了正则表达式:manpages.org/perlre -- 我不知道是否有兴趣将它们移植到 flex

标签: flex-lexer lex


【解决方案1】:

当然。只需使用 | 运算符:

letters             [a-zA-Z]
digits              [0-9]
lettersAndDigits    {letters}|{digits}
wordCharacters      {lettersAndDigits}|_

Flex 提供了{+} 运算符,它计算两个字符类的并集。此外,通常更有用的是 {-} 运算符,它计算集合差异。两者都在documentation for Flex patterns 中进行了描述,如果您使用的是 Flex,这当然值得一读。

不幸的是,这些运算符不能与宏一起使用,因为 Flex 宏的扩展自动用括号括起来(这就是上面的宏在 Flex 中工作的原因)。对于 Flex,带括号的字符类是子表达式,而不是字符类,因此它不允许作为集合运算符的操作数。但即使你能做到这一点,它也不会提供任何真正的优势。编译出来的正则表达式本质上是一样的;字符类的联合并不比模式的联合更有效。

但是,对于这些特殊情况,不需要使用宏。只需使用内置的命名字符类。代替{letters},您可以使用[[:alpha:]]{lettersAndDigits} is [[:alnum:]]{wordCharacters}[[:alnum:]_]。使用标准 Posix 类可以让阅读您的代码的任何人都不必弄清楚您的特殊宏扩展为什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2014-03-23
    相关资源
    最近更新 更多