【问题标题】:Using Regex to match multiple instances of a character in a string from a list but only one of the following characters使用正则表达式匹配列表中字符串中字符的多个实例,但仅匹配以下字符之一
【发布时间】:2026-02-09 06:30:01
【问题描述】:

假设我有一组字符 {abcd} 。 假设我有一个字符串序列。

aabb
ddccddcc
aaaa
bbbb
dddd
cdddcd

我想写一个正则表达式来匹配所有字符串,其中任何一个(并且只有一个)字符连续重复四次,我们匹配这个字符串。

例如,aaaa 为真。但是aabb不符合这个条件,好像它连续使用了集合中的一个字符,而不是同一个四个字符。此外,由于四个 dc 字符分隔,因此 cdddcd 将不符合此标准。因此,我们必须排除使用 [abcd]{4} 。

虽然我可以做到以下几点:

a{4}    { return A;}
b{4}    { return B;}
c{4}    { return C;}
d{4}    { return D;}

但是,我想提高编写正则表达式的能力,并且我确信必须有一种方法使用表达一些逻辑来执行我希望使用更少语句的任务。谢谢阅读! :)

【问题讨论】:

  • 如果a{4}b{4}c{4}d{4}应该分别返回ABCD,如何将它们合并成即使有可能,单一模式也有帮助?您必须打开 yytext[0] 或其他东西 - 这几乎不会使代码更简单。

标签: regex flex-lexer


【解决方案1】:

除了像你一样写出来之外,没有办法在 Flex 正则表达式中写出来。

许多所谓的“正则表达式”库确实提供了一种方法,通常称为“反向引用”。这些库通常具有多种此类功能,这些功能可能导致正则表达式匹配需要二次甚至指数时间(尽管它们可能非常方便)。

但是,flex 没有实现这些功能。 Flex 正则表达式确实是正则表达式(也就是说,它们对应于数学模型),因此可以编译成状态机,其执行时间保证线性且通常非常快速。在 Flex 的预期用例(编译器)中,令牌很少需要复杂的模式,性能保证很重要。

(这不是完整的故事,但它是一个很好的近似值。)

【讨论】:

    最近更新 更多