因此,我必须为以下语言制作一个正则表达式,以检查字符串(a | b | c)*是否以字符串“ abc”结尾的适当性。 所以我做了以下正则表达式:
((a|b|c)*((a|b)+|(a|c)+|b(b|c)+))
这是我的老师教我的方式,但是我在https://regex101.com/上进行了测试 通过更多的研究,我了解到理论上它应该等效于以下正则表达式:
([abc]*([ab]+|[ac]+|b[bc]+))
但是,该网站使用我的正则表达式做了一些有趣的事情,但我不知道如何使用它。 那么我的语言的正则表达式是什么?
答案 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/1和https://regex101.com/r/jBIjlu/2
答案 1 :(得分:0)
这里是Jan的答案的替代解决方案:
^(?:a(?!bc$)|b|c)*$
它使用先行而不是向后搜索,并且匹配包含零个或多个“ b”,零个或多个“ c”,零个或多个“ a”的整行,前提是该“ a”后没有“ bc”然后是行尾。