GG资源网

正则表达式匹配的问题

问题描述:

如下,问题在注释中,麻烦帮忙解答一下,谢谢

正则表达式匹配的问题

正则表达式的符号懂,但是下图“会一直匹配到12后面的/,这样 结果就是[\'23\']”是怎么推理得出的?
“括号里的内容从2018的2开始匹配,因为后面一个数字 是0,那么也就满足了(\\d.*?\\d)”又是怎么推理得出的?

正则表达式匹配的问题

网友观点:

重要的一点是,点星号(.*)表示0个或任意个任意字符。
所以贪婪搜索的话,23之前都满足匹配条件,然后小括号是捕获组,只显示23
而懒惰搜索(非贪婪)的话,两个连续的数字就满足条件 (\\d.*?\\d) 了

20一共两个\\d,中间那个非贪婪.*?啥都没匹配到,18同理发布于20被前面的.*?吸收了两个\\d只匹配到18,一个\\d只能匹配一个数字而不是一个数

正则表达式的匹配查找原理是什么

1,正则表达式的使用

2,正则表达式匹配搜索算法

3,正则表达式引擎:DFA和NFA

4,正则表达式的性能与优化

1,正则表达式的使用

正则表达式(Regular Expression 简写regex),是一种字符串匹配的模式(pattern),用来匹配搜索一段已知字符串中是否含有自己需要的子字符串,

初次接触正则表达时会觉得很深奥难写,这么多符号怎么记呢。其实当你通过几个实际例子应用之后就会觉得也没那么难。

比如:

1.给你一个字符串,把字符串里面的链接、数字、电话等显示不同的颜色;

2.给你一个包含自定义表情的文字,找出里面的表情,替换成本地的表情图片;

3.根据用户的输入内容,判断是否是微信号、手机号、邮箱、纯数字等;

而正则的应用也不仅仅局限于业务代码中的字符串匹配,编辑器的查找替换,grep查找命令,vim编辑查找等都有用到。

所以,学习正则表达式并不是我们照着正则规则可以实现业务逻辑就够了,最好还要能知其所以然。

2,正则表达式匹配搜索算法

说到字符串匹配算法,常见有朴素字符串匹配算法,KMP算法,有限自动机算法(Finite Automation)等。而正则表达式用到的就是有限自动机算法。

有限状态机(finite-state machine,FSM)又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。有些地方也叫“自动机”,指的都是同一个东西。

FSM常用状态转移图来表示,下图就是一个状态转移图:

比如我今年18岁,我现在处于18岁的状态,如果时间过了一年,我就变成19岁的状态了,再过一年就20了。当然我20岁时时光倒流2年我又可以回到18岁的状态。

每个圈代表一个节点表示一种状态,每条有向边表示一个状态到另一个状态的转移条件。上图中状态是我的年龄,边表示时间正向或者逆向流逝。

所以通过边上条件的转移我们可以从一个状态转移到另一个状态,如果我们把要匹配的字符串的首字母和尾字母作为起始态和终止态,当从起始态可以顺利的走到终止态是不是就表示匹配成功了呢?

没错,就是这样的。

举个栗子:

给定正则表达式a(bb)+a,其中+表示匹配前面的子表达式一次或多次,那么该正则表达式对应的FSM状态转移图如下:

假设输入字符串是 abbbba。当机器读取字符串的第一个字母 时 a,它处于起始状态s 0。它跟随 a 箭头到达状态s1。

当机器读取字符串的其余部分时重复此过程:b,b,b,b ,最后是 a。 也就是s1->s2->s3->s2->s3->s4

所以字符串abbbba可以被这个正则所匹配。

该状态机结束于最后一个状态,这是一个匹配成功的状态。

若状态机结束于非匹配成功状态,那么匹配失败。如果在运行过程中,没有办法到达其他状态,那么状态机提前结束。

3,正则表达式引擎:DFA和NFA

上面例子的状态机中,任何状态每个可能的输入字符,最多只会让它转到一个新的状态,也就是说新状态是确定性的,所以上述状态机被称为:确定性有限状态自动机(Deterministic finite automaton,DFA)。

对于给定的任意一个状态和输入字符,DFA只会转移到一个确定的状态。并且DFA不允许出现没有输入字符的状态转移。

同样,如果在一个状态上输入字符可能会转移到多个不同的状态,那么这种状态机就是非确定性的,称为:非确定型有穷自动机(Non deterministic Finite Automaton,NFA)

对于任意一个状态和输入字符,NFA所能转移的状态是一个非空集合。

虽然是两种不同形态的状态机,但是DFA和NFA存在等价性,也就是说NFA和DFA是可以相互转换的。

比如上面例子的DFA,就可以转换为下面的NFA:

由于NFA的非确定性,在面对一个输入的时候可能有多条可选的路径,所以在一条路径走不通的情况下,需要回溯到选择点去走另外一条路径。

但DFA不同,在每个状态下,对每个输入不会存在多条路径,就不需要递归和回溯了,可以一条路走到黑。DFA的匹复杂度只有O(n),但因为要递归和回溯NFA的匹配复杂度达到了O(n^2)。

所以将引擎中的NFA转化为DFA的场景更多。

但是,因为DFA支持的功能较少,所以一般的业务代码语言还是选择了NFA引擎。

4,正则表达式的性能与优化

这两种引擎有着极为不同的性能表现

其中一种用在许多语言的标准解释器,用的是递归回溯算法(有Perl,Ruby,python等)。另外一种用在为数不多的地方(主要是awk,grep和Thompson NFA)。

实际业务代码中的正则表达式远比上面描述的要复杂的多,因为他们还要支持各种字符集,转义序列,有限重复,部分匹配提前和断言等,比如*,+,\\d,[0-9],^,$,(?=)等等。

既然NFA会有递归回溯,那么就会有递归回溯的性能问题,如果一个正则表达式特别模糊,那么会带来怎么样的问题呢?

曾经国外有位工程师因为写了十分模糊的正则导致cpu被打爆:

由于网站搬家,部分链接失效,如无法下载,请联系站长!谢谢支持!
1. 带 [亲测] 说明源码已经被站长亲测过!
2. 下载后的源码请在24小时内删除,仅供学习用途!
3. 分享目的仅供大家学习和交流,请不要用于商业用途!
4. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
5. 本站所有资源来源于站长上传和网络,如有侵权请邮件联系站长!
6. 没带 [亲测] 代表站长时间紧促,站长会保持每天更新 [亲测] 源码 !
7. 盗版ripro用户购买ripro美化无担保,若设置不成功/不生效我们不支持退款!
8. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
9. 如果你也有好源码或者教程,可以到审核区发布,分享有金币奖励和额外收入!
10.如果您购买了某个产品,而我们还没来得及更新,请联系站长或留言催更,谢谢理解 !
GG资源网 » 正则表达式匹配的问题

发表回复

CAPTCHAis initialing...