正则表达式问题

Regular expresion problems

所以我必须为以下语言制作一个正则表达式来检查 (a|b|c)* 是否符合字符串不会以 "abc" 结尾的原则。 所以我制作了以下正则表达式:

((a|b|c)*((a|b)+|(a|c)+|b(b|c)+))

这是我的老师教我的,但是我在 https://regex101.com/ 上测试过 通过更多的研究,我了解到理论上它应该等同于以下正则表达式:

([abc]*([ab]+|[ac]+|b[bc]+))

但是该网站对我的正则表达式做了一些有趣的事情,我不知道如何使用它。 那么我的语言的正则表达式是什么?

我建议使用负向后回顾模式 (https://www.regular-expressions.info/lookaround.html#lookbehind) 来检查字符串是否不以某个序列结尾。

^(?:a|b|c)*(?<!abc)$
or
(?:a|b|c)*(?<!abc)

处理器查找由 abc 组成的文本,当它找到最大字符串时,它会检查末尾是否有 NOT "abc"。如果是,它会丢弃最后一个字符并反复尝试,直到可以继续执行以下步骤。

查看示例 https://regex101.com/r/jBIjlu/1 and https://regex101.com/r/jBIjlu/2

这里是 Jan 回答的替代解决方案:

^(?:a(?!bc$)|b|c)*$

它使用前瞻而不是后视,它匹配包含零个或多个 "b"、零个或多个 "c"、零个或多个 "a" 的完整行,因为此 "a" 后不跟 "bc" 后跟行尾。