千家信息网

正则表达式中的lastIndex的作用是什么

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这期内容当中小编将会给大家带来有关正则表达式中的lastIndex的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。依次写出下列输出内容。var reg1
千家信息网最后更新 2025年12月03日正则表达式中的lastIndex的作用是什么

这期内容当中小编将会给大家带来有关正则表达式中的lastIndex的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

依次写出下列输出内容。

var reg1 = /a/;var reg2 = /a/g;console.log(reg1.test('abcabc')); // trueconsole.log(reg1.test('abcabc')); // trueconsole.log(reg1.test('abcabc')); // trueconsole.log(reg1.test('abcabc')); // trueconsole.log(reg2.test('abcabc')); // trueconsole.log(reg2.test('abcabc')); // trueconsole.log(reg2.test('abcabc')); // falseconsole.log(reg2.test('abcabc')); // true

很简单的一个正则表达式测试,查找字符串abcabc中是否有字符a。但是结果却有一个特殊false存在,Why?

lastIndex(针对于带参数g的正则表达式)

在每个实例化的RegExp对象中,都存在一个lastIndex属性,其初始值为0。

/a/.lastIndex // 0new RegExp('a').lastIndex // 0lastIndex表示匹配成功时候,匹配内容最后一个字符所在原字符串中的位置 + 1,也就是匹配内容的下一个字符的index(如果匹配内容在字符串的结尾,同样返回原字符串中的位置 + 1,也就是字符串的length)。如果未带参数g,lastIndex始终为0。var reg = /ab/g;reg.test('123abc');console.log(reg.lastIndex) // 5// 匹配内容在最后var reg = /ab/g;reg.test('123ab');console.log(reg.lastIndex) // 5// 不带参数gvar reg = /ab/;reg.test('123abc');console.log(reg.lastIndex) // 0

而这个lastIndex也就是用该正则进行其他匹配操作的时候匹配开始的位置。而匹配失败时重置lastIndex为0。

var reg = /ab/g;// 初始值为0,从最开始匹配 匹配成功, lastIndex为4console.log(reg.test('12ab34ab'), reg.lastIndex); // true 4// 从第4位字符"3"开始匹配 匹配内容为第二个ab lastIndex 为 8console.log(reg.test('12ab34ab'), reg.lastIndex); // true 8// 从第8位 (字符长度为8,没有第8位) 开始匹配 匹配不成功 重置lastIndex 为 0console.log(reg.test('12ab34ab'), reg.lastIndex); // false 0// 从头匹配 同第一步console.log(reg.test('12ab34ab'), reg.lastIndex); // true 4

看到这里题目也就解答完毕,接下来是扩展。

对于未重新声明的reg容易犯错的地方。

// 测试字符串str1 和 str2 是否都含有ab字符var reg = /ab/g;var str1 = '123ab';var str2 = 'ab123';console.log(reg.test(str1)); // trueconsole.log(reg.test(str2)); // false

很明显这里因为lastIndex的原因导致判断错误。这里可以修改reg不带参数g或则重新声明reg,当然也可以在第一次匹配后手动修改reg.lastIndex = 0。

预查

接着说预查,字面意思就是预备匹配查询,也就是查询匹配内容接下来的内容,但是只是预备查询匹配,并不返回。

经常我们需要匹配到字符串中某些字符后面跟某些字符,但是我们不需要匹配结果中包含后面跟的字符,例如:

找出下面字符串中字符后面是2的所有字符。

var str = 'a1b2c22d31e4fg6h3';'a1b2c22d31e4fg6h3'.match(/[a-z]2/g); // ["b2", "c2", "h3"]

这样,虽然能匹配出字符串带2的,但是数字2我们并不需要,这里只需要字符。而用预查:

'a1b2c22d31e4fg6h3'.match(/[a-z](?=2)/g); // ["b", "c", "h"]

可以看到完全满足条件,但是预查和本文的主题lastIndex又有几毛钱的关系呢?

我们用test来看看,至于为什么用test这里要说明一下,match是匹配所有,直到匹配不成功的时候结束匹配,而匹配不成功时,lastIndex就被重置为0了。

而exec和test是第一次匹配成功或者匹配失败就返回,并不会接着往下匹配。

var reg1 = /[a-z](?=2)/g;var reg2 = /[a-z]2/g;var str = 'a1b2c22d31e4fg6h3';console.log(reg1.test(str), reg1.lastIndex); // true 3console.log(reg1.test(str), reg1.lastIndex); // true 5console.log(reg1.test(str), reg1.lastIndex); // true 16console.log(reg1.test(str), reg1.lastIndex); // false 0console.log(reg2.test(str), reg2.lastIndex); // true 4console.log(reg2.test(str), reg2.lastIndex); // true 6console.log(reg2.test(str), reg2.lastIndex); // true 17console.log(reg2.test(str), reg2.lastIndex); // false 0

看出问题没有?预查的lastIndex不包含预查内容! 这里就可以用来简化很多判断了。

例如我们要匹配密码必须有至少一个大写字母,一个小写字母,一个数字,并且长度至少6位而且只能是数字字母组合。

按照不会预查的情况会这样去判断:

/[a-z]/.test(pwd) && /[A-Z]/.test(pwd) && /\d/.test(pwd) && /^[a-zA-Z0-9]{6,}$/.test(pwd);

但是:

/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z0-9]{6,}$/.test(pwd)

分解出来看:

(?=.*[a-z]) 是否有小写字母 但是是预查 匹配失败返回false 成功lastIndex不变动,还是为0,同理理解两外预查内容,最后就是6喂以上的字母数字组合匹配,但是前面都是预查,lastIndex始终未0,每次匹配都是从最开始匹配的,所以满足要求。

上述就是小编为大家分享的正则表达式中的lastIndex的作用是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

字符 内容 字符串 成功 正则 字母 表达式 也就是 参数 数字 位置 就是 时候 查询 作用 接下来 小写 第一次 结果 长度 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科密考勤机数据库如何修改 江苏电话软件开发服务优化 信息安全风险数据库 互联网科技怎么建设 上云网络安全吗 云顶之奕手游服务器换区 湖南一站式网络技术服务技巧 交口县国家网络安全宣传 胡敏软件开发工程师 达梦数据库修改字段的sql语句 部队网络安全基地在哪 内蒙古智慧人口系统软件开发 中国网络安全产业协会 网络安全教育手抄报五年级 软件开发系统详细设计 数据库交易明细表设计 剪影提取音乐服务器正在升级 软件开发会用到什么 大宗交易所软件开发 国产串口通信服务器 海康摄像头开启虚拟服务器 金鹰防盗网络安全吗 数据库原理与应用05北师 成都直销软件开发要多少钱 弱视软件开发 学校软件开发及存储管理合同 剪影提取音乐服务器正在升级 丰县创新软件开发承诺守信 数据库设计和应用题 ubuntu服务器修改固定ip
0