关于js正则表达式的贪婪和懒惰模式

发布 : 2018-11-30 分类 : 正则 浏览 :

1、量词

正则表达式的量词有:* + ? {}

* : 匹配0次到多次
    + : 匹配1次到多次
    ? : 匹配0次或1次
    {n,m} : 匹配至少n次,最多m次
    {n} : 匹配n次
    {0,} : 等价于*
    {1,} : 等价于+
    {0,1} : 等价于?

量词默认是贪婪模式,当在量词后面加上一个问号?时,就变成了懒惰模式。

2、贪婪模式

使用量词(* + ? {})时,默认为贪婪模式。
贪婪模式尝试匹配最多字符,具体怎么做呢?
首先尝试匹配整个字符串,如果匹配不成功,就去掉最后一个字符,并再次尝试匹配,直到匹配成功或者字符串为空为止。
举个例子:

1
2
3
4
demo1.js
let str1 = 'xxx123xxxxxxxxxx123xxx';
let regex1 = /.*123/;
console.log(regex1.exec(str1)[0]);

输出结果:’xxx123xxxxxxxxxx123’
分析demo1代码,由于使用量词,因此默认为贪婪模式,会尝试匹配最多字符,即匹配全部字符
第1次尝试:’xxx123xxxxxxxxxx123xxx’ 与 /.
123/ 不匹配
第2次尝试:’xxx123xxxxxxxxxx123xx’ 与 /.123/ 不匹配
第3次尝试:’xxx123xxxxxxxxxx123x’ 与 /.
123/ 不匹配
第4次尝试:’xxx123xxxxxxxxxx123’ 与 /.*123/ 匹配
因此匹配结果为:’xxx123xxxxxxxxxx123’

3、懒惰模式

在量词(* + ? {})后直接加上?时,即为懒惰模式。
懒惰模式尝试匹配最少字符,具体怎么做呢?
首先尝试匹配空字符串,如果匹配不成功,就多读取一个字符,并再次尝试匹配,直到匹配成功或者整个字符串读取完为止。
看下面例子:

1
2
3
4
demo2.js
let str2 = "xxx123xxxxxxxxxx123xxx";
let regex2 = /3*?/;
console.log(regex2.exec(str2)[0]);

输出结果:’’

分析demo2代码,由于在量词后加入了?,因此采用懒惰模式,会尝试匹配最少字符。
第1次尝试:’’ 与 /3
?/ 匹配
因此匹配结果为:’’

本文作者 : Simple
原文链接 : https://simplecodecx.github.io/blog/20181130/3ba3fd82.html
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
留下足迹