AI工具人
提示词工程师

用正则表达式匹配3的任意倍数

正则表达式能匹配3的任意倍数?(注意是任意倍数) ,我曾经也很震惊,但确实可以。我5年多前练习正则表达式,在Regex Golf这个正则表达式测试网站上发现了这个题,当时完全没有任何头绪,于是我在知乎提问正则表达式如何匹配 3 的倍数 ,但是得到了好多知乎大佬的关注,也上了当天的热榜。 排名第一的答主已经给出了答案和思路,但这么多年来我一直都没看懂,最近学习编译原理,看到正则表达式和DFA,于是仔细研究了一下这个问题,并将问题扩展至匹配N的倍数,最后给出通用解法和代码。

^(([0369]|[147][0369]*[258])|([258]|[147][0369]*[147])([0369]|[258][0369]*[147])*([147]|[258][0369]*[258]))*$  

先给出答案,上面这个正则表达式确实能够匹配任意3的着倍数,再次强调是任意,它确实能匹配任意长度的3的倍数(严谨一点应该是正整数倍,这里不再细究)。 这个正则表达式是这么来的?实际上它是由下面这个DFA(确定性有穷状态机)生成的。
在这里插入图片描述

构造DFA

那这个DFA又是如何来的?首先我们来解释下何为DFA(Deterministic finite automata),首先DFA是一种状态机(automata),状态机是用来描述状态在不同条件下相互转换的关系,DFA就是在指定条件下,这个状态转换路径是确定且唯一的,这也是它和NFA(Nondeterministic finite automata)的区别。 在正则表达式中,DFA就是在给定某个字符的情况状态如何转移,一般情况下有个初始状态和终止状态,如上图所示状态A就是终止状态,一般用双层环表示,上图并为标识初始状态,其实这里初始状态也是A。在正则表达式对应的DFA中如果当前状态是终止状态,说明正则表达式匹配成功。

赞(0) 打赏
未经允许不得转载:XINDOO » 用正则表达式匹配3的任意倍数
描述文字

评论 1

  1. #1

    如果我说你牛,那是在侮辱你,你狠牛

    匿名3年前 (2023-12-02)回复

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫