使用 Regex 匹配列表中字符串中一个字符的多个实例,但仅匹配以下字符之一
Using Regex to match multiple instances of a character in a string from a list but only one of the following characters
假设我有一组字符 {abcd} 。
假设我有一个字符串序列。
aabb
ddccddcc
aaaa
bbbb
dddd
cdddcd
我想写一个正则表达式来匹配这个集合中的任何一个(并且只有一个)字符连续重复四次的所有字符串,我们匹配这个字符串。
例如,aaaa 为真。而aabb则不符合这个条件,好像它连续多次使用集合中的一个字符,但不是同一个四个字符。此外,cdddcd 不符合此标准,因为四个 d 由 c 字符分隔。因此,我们必须排除使用 [abcd]{4} .
尽管我可以执行以下操作:
a{4} { return A;}
b{4} { return B;}
c{4} { return C;}
d{4} { return D;}
但是,我想培养自己编写正则表达式的能力,而且我确信一定有一种方法可以使用表达一些逻辑来执行我希望使用更少语句的任务。谢谢阅读! :)
除了像您那样写出来之外,没有其他方法可以在 Flex 正则表达式中编写它。
许多所谓的 "regex" 库确实提供了一种方法,通常称为 "back-references"。这些库通常带有各种此类功能,这可能导致正则表达式匹配花费二次甚至指数时间(尽管它们可能非常方便)。
但是,flex 没有实现这些功能。 Flex 正则表达式确实是正则的(也就是说,它们对应于数学模型),因此可以编译成状态机,其执行时间保证线性且通常非常快速。在 Flex 的预期用例中——编译器——令牌很少需要复杂的模式,性能保证很重要。
(这不是完整的故事,但它是一个很好的近似值。)
假设我有一组字符 {abcd} 。 假设我有一个字符串序列。
aabb
ddccddcc
aaaa
bbbb
dddd
cdddcd
我想写一个正则表达式来匹配这个集合中的任何一个(并且只有一个)字符连续重复四次的所有字符串,我们匹配这个字符串。
例如,aaaa 为真。而aabb则不符合这个条件,好像它连续多次使用集合中的一个字符,但不是同一个四个字符。此外,cdddcd 不符合此标准,因为四个 d 由 c 字符分隔。因此,我们必须排除使用 [abcd]{4} .
尽管我可以执行以下操作:
a{4} { return A;}
b{4} { return B;}
c{4} { return C;}
d{4} { return D;}
但是,我想培养自己编写正则表达式的能力,而且我确信一定有一种方法可以使用表达一些逻辑来执行我希望使用更少语句的任务。谢谢阅读! :)
除了像您那样写出来之外,没有其他方法可以在 Flex 正则表达式中编写它。
许多所谓的 "regex" 库确实提供了一种方法,通常称为 "back-references"。这些库通常带有各种此类功能,这可能导致正则表达式匹配花费二次甚至指数时间(尽管它们可能非常方便)。
但是,flex 没有实现这些功能。 Flex 正则表达式确实是正则的(也就是说,它们对应于数学模型),因此可以编译成状态机,其执行时间保证线性且通常非常快速。在 Flex 的预期用例中——编译器——令牌很少需要复杂的模式,性能保证很重要。
(这不是完整的故事,但它是一个很好的近似值。)