定期表达问题

时间:2018-11-15 10:40:26

标签: regex regular-language

因此,我必须为以下语言制作一个正则表达式,以检查字符串(a | b | c)*是否以字符串“ abc”结尾的适当性。 所以我做了以下正则表达式:

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

$this->db->select('*');
$this->db->from('test1');
$this->db->join('test2', 'test2.secondary_type = test1.p_id');

处理器查找由^(?:a|b|c)*(?<!abc)$ or (?:a|b|c)*(?<!abc) 组成的文本,并在找到最大字符串时进行检查,最后是否没有abc。如果是,它将丢弃最后一个字符并一次又一次尝试,直到可以继续执行以下步骤为止。

请参见示例https://regex101.com/r/jBIjlu/1https://regex101.com/r/jBIjlu/2

答案 1 :(得分:0)

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

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

它使用先行而不是向后搜索,并且匹配包含零个或多个“ b”,零个或多个“ c”,零个或多个“ a”的整行,前提是该“ a”后没有“ bc”然后是行尾。