正则表达式回溯

2019-1-9 15:18| 作者: admin| 查看: 115| 评论: 0|来自: 蚂蚁部落

生活中,人人都会面对诸多的选择,然而人非圣贤,都可能犯错。

就如同站在一个十字路口,走错一条路,只要再回到起点,重新选择正确的路即可。

上面好像说的有点轻松随意,总之,大多数情况是有挽回的余地,所以遇到困难的时候不要太灰心。

正则表达式的回溯给了匹配重新选择的机会,可以从头再来,下面对此概念进行一下分析。

一.正则表达式回溯简单介绍:

NFA正则表达式引擎会对正则表达式各个匹配单元依次处理。

在处理过程中,可能会遇到多个可能匹配成功的匹配单元,那么就首先尝试第一个,其他可能的匹配单元作为备用,如果第一个匹配失败,那么正则表达式引擎会回溯到首次尝试匹配之前的位置,然后再尝试第二个可能匹配成功的单元,以此类推,上面阐述的这种匹配方式就是正则表达式回溯。

二.正则表达式匹配回溯分解:

虽然上面对回溯进行阐述,如果不结合代码实例,可能还是不好理解。

下面对一个简单的代码实例进行分解:

[JavaScript] 纯文本查看 复制代码运行代码
let str="ab";
let reg=/a(d|b)/g;
console.log(str.match(reg));

代码运行效果截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201901/09/151931ovifx588xo38yvgh.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

字符串"ab"在正则引擎眼中构成可以用下图表示:

a:3:{s:3:\"pic\";s:43:\"portal/201901/09/151940hieyl9b09ee0bbbs.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

下面对匹配过程进行一下分解:

(1).首先,正则表示中的字符"a"获取控制权,从位置0处开始匹配,匹配到字符"a",匹配成功。

(2).然后,匹配控制权转到匹配单元(a|b),这是一个正则表达式选项,也就是a或者b都有可能匹配成功。

(3).首先尝试"d"是否匹配,并将"b"作为备选项,以备使用。

(4).结果"d"匹配失败,那么正则表达式回溯到尝试之前的位置,位置1处,再尝试备选项"b",匹配成功。

(5).于是最后的匹配结果是字符串"ab"。

上面的代码虽然简单,但足以展示正则表达式回溯的基本原理,上面介绍回溯其实涉及到了正则的其他知识。

比如对于字符串的图示分解,位置0、位置1和位置2,还有正则表达式选项等概念,本文不做介绍。

具体相关内容可以参阅如下几篇文章:

(1).匹配原理可以参阅正则表达式匹配原理一章节。

(2).选项可以参阅正则表达式 竖杠|选项一章节。


鲜花

握手

雷人

路过

鸡蛋
上一篇:RegExp.lastparen

最新评论

返回顶部