前端的正则使用(原理篇)

本篇接上篇的基础篇,是对基础篇从原理上加以理解。

1,捕获原理

1.1,捕获组编号规则

捕获组就是把正则表达式中的子表达式匹配的内容,保存到内存中以数字编号的组里,方便后面引用。

编号规则指的是以数字为捕获组进行编号的规则

规则中编号为0的捕获组,指的是正则表达式整体。

捕获组通过从左到右计算其左开括号来编号 

举例:正则表达式可以用来匹配格式为yyyy-MM-dd的日期,为了在下表中得以区分,月和日分别采用了\d{2}\d\d这两种写法。

用以上正则表达式匹配字符串:2008-12-31,匹配结果为:

编号 捕获组 匹配内容

0

(\d{4})-(\d{2}-(\d\d))

2008-12-31

1

(\d{4})

2008

2

(\d{2}-(\d\d))

12-31

3

(\d\d)

31

1.2,捕获组的反向引用

反向引用是用来查找或限定重复、查找或限定指定标识配对出现等等。

这个定义有点难理解,但其实说起来简单,就一个字:重复。比如  ‘1122334455’ 如何用正则匹配这种数字?

按照前面的知识,会发现有点不知所措。但用反向引用就很简单:

var reg = /(\d)\1/g  

上面正则表达式中,整个表达式的编号是 0 。(\d) 捕获组的编号是 1. 而 \1 就是反向引用,引用的是分组1. 匹配过程如下:

  • 在str字符串的第0个位置上是1,第一次捕获成功,1被放在一个编号是1的捕获组里;

  • 接着进行正则的第二部分,这一步是\1,因为编号是1的捕获组里存放的是上一步中捕获的1,所以这个\1就是指代1,所以\1的意思就是再次匹配1;

  • 因为str字符串的第1位置上是1,所以捕获成功;

比如,还可以再复杂一点:

1.3 断言

上一篇说,断言是非捕获组。当时并没有对非捕获组的概念作出解释。这里解释一下:非捕获组不会有捕获编号,当然也没法引用。

2,匹配次数中的贪婪与非贪婪

在使用修饰匹配次数的量词时,比如:"{m,n}", "{m,}", "?", "*", "+",具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配,即“贪婪匹配原则”。比如,针对文本 "dxxxdxxxd",举例:

var reg = /\d+/  
console.log(reg.exec('122222222222222222q')) // 122222222222222222

非贪婪模式:

在修饰匹配次数的特殊符号后再加上一个 "?" ,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 "不匹配"。这种匹配原则叫作 "非贪婪" 模式,也叫作 "勉强" 模式。如下图:

猜你喜欢

转载自blog.csdn.net/Hill_Kinsham/article/details/81872520
今日推荐