正则匹配原理
啦啦啦 我是一个搬运工,搬错打轻点儿 _-
说说正则的引擎
给你一个世界观
我要去西藏,走过去?内蒙离西藏 还是挺远的 我没病哈哈。我要开嘟嘟嘟的小汽车去,我只要把握好方向 发动机机会带着我去西藏看大草原了。
这个过程中:驱动就是动力系统,我们不必要关系他怎么工作的,握好方向盘就是了。
动力系统是什么呢:引擎 + 驱动装置
那这个小车车是什么类型的呢:传统的汽油机 OR 炫酷的电动车
开车的问题呢:汽油机会污染空气 但是马力足啊,电动车不污染空气 车速快 但是动力不行
所以我想要一个即速度快 有动力还不污染的车车(帅的人环保意识都强 没办法)
如果以环保为标准,我们可以得出了四种车车:污染空气的汽油车、不污染空气的汽油车、污染空气的电动车、不污染空气的电动车
电动车都不污染空气所以就只有三种了:污染空气的汽油车、不污染空气的汽油车、电动车
(虽然有点无厘头 不过先记住这个类比哈哈 对装逼有帮助)
正则引擎的分类
之前可以看看这个 恶补一下知识点(看完了 可以自己写引擎呦 点我 点我 嘤嘤嘤)
正则的引擎可以分为两种
- DFA(确定的有穷状态自动机 只要知道有就好了)-电动车
- NFA(非确定的有穷状态自动机 需要知道具体匹配到的东西)-汽油机
- POSIX 版本的NFA - 即速度快 有动力还不污染的车车
NFA比DFA出现时间要早一点,像.NET、PHP、JS都用的是这个,有些甚至还用到了egrep和awk,也有一些是混合使用这个两个的(存在性查找 用DFA,真实查找用NFA),具体如下表:
DFA的出现,必须是NFA出问题了,最主要的就是发展太久 没有规范,所以POXIS约定了一波引擎需要支持的元字符和特性,DFA是符合这标准的,所以NFA要先够装逼 就要先自己规范一波行为。
- 这里的POXIS只是匹配意义上的,规定了表达式应该有那些行为,而不是POXIS引入了一些匹配特性!
一双火眼金睛
一般区分引擎就像兼容IEX一样,检车特性就好了
- 支持忽略优先量词:NFA。在POSIX和DFA中是没有意义的,nfa|nfa not 匹配 naf,如果结果是naf not 那就不是NFA了
- 支持捕获分组和回溯:NFA。 XX———————– 匹配 X(.+)+X,如果死机&#x