手写正则与自动机代码生成之,std::regex劝退

        天下利器,正则占一席。

有穷自动机

        大学时候学过自动机,但是并不是很理解。其实这玩意儿就是状态的转换。当程序在有限个数据类型中来回切换的话,是可以构建为自动机模型的。而这不就是c++里类的抽象吗,配合面向对象编程简直起飞。

自动机与正则

        正则同样可以直接化为自动机模型,唯一不同的是出现()时会有嵌套结构,此时虚节点的引入成为了必要。此外由于匹配次数,需要在转换路径上进行次数限制,因此同样,由于嵌套存在,还需要由一个清空一个嵌套节点内计数的触发清除计数的逻辑。

而无穷自动机部分仅仅是匹配次数从有限次数变为无限制次数而已。

 (a|b)(c|d)\*(e|f)

 

构建自动机

        画图太麻烦了,自己草稿纸花把。用掉我好几周草稿纸。注意在节点转换路径上加入计数以及触发计数清空就行了,还有就是虚节点来处理嵌套问题。

        自动机可以不一样,只要等效。同样的输入得到同样的状态输出即可。

撸代码,自己上正则

        

恕我直言

        自己撸中间踩了很多坑,算是复习了大学的知识了。花了几周才弄好。比stl的好用一点我感觉,而且没那么多crt依赖,可以放在内核使用。

        这么长的正则你怕不怕,这么长的正则stl::regex会卡死,你信不信。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值