关于JS 中正则表达式第一次判断为 true,第二次判断为false的问题

Posted 圆滚滚的胖狸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于JS 中正则表达式第一次判断为 true,第二次判断为false的问题相关的知识,希望对你有一定的参考价值。

前言:今天在做自己的个人项目的时候,使用邮箱的正则表达式进行匹配登录验证时发现用户输入的同一个值在使用同一个正则表达式进行匹配时,会出现第一次匹配为 true,第二次匹配却是false的问题。

我是使用JS 正则表达式对象中的 RegExp.test() 方法进行匹配的,后面查阅了相关资料之后发现了一些端倪。
首先,正则表达式主要分为如下几种:
1、 i (不区分大小写)
2、g (全局匹配)
3、m (多行匹配)
而在设置为 g 标志时使用 RegExp.test() 和 RegExp.exec() 两个方法进行匹配时(我是使用 g 标志的),两者会根据自身的 lastIndex 属性所指向的位置作为下次匹配的开始点,一旦RegExp匹配过一次之后,lastIndex 属性会变更,这时候再次使用此RegExp匹配值时则会返回 false 。
问题代码如下:

let reg = /^([a-zA-Z0-9_-])+@(sina|qq)+((\\.[a-zA-Z0-9_-]2,3)1,2)$/g
console.log(reg.test('15698@qq.com'))  // true
console.log(reg.test('15698@qq.com'))   // false , 出现问题

通常出现这个问题,可以有以下两种解决方案:
1、将 RegExp 的 lastIndex 属性归为 0

let reg = /^([a-zA-Z0-9_-])+@(sina|qq)+((\\.[a-zA-Z0-9_-]2,3)1,2)$/g

console.log(reg.test('15698@qq.com'))  // true
reg.lastIndex = 0 //将reg 对象的 lastIndex 属性归 0 ,让其重新规定匹配位置。
console.log(reg.test('15698@qq.com'))   // true

2、去掉RegExp 中的 g 标志,改为其他匹配规则。

let reg = /^([a-zA-Z0-9_-])+@(sina|qq)+((\\.[a-zA-Z0-9_-]2,3)1,2)$/i 
//这里改变为 i 匹配规则,不让 RegExp 使用 lastIndex 属性规定匹配位置
console.log(reg.test('15698@qq.com'))  // true
console.log(reg.test('15698@qq.com'))   // true


————————————————
版权声明:本文为CSDN博主「小白菜duang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42995152/article/details/104174402

以上是关于关于JS 中正则表达式第一次判断为 true,第二次判断为false的问题的主要内容,如果未能解决你的问题,请参考以下文章

js判断字符串是不是为字母

js正则表达式 判断输入框是不是为正整数或者正整数保留两位小数

js中如何用正则判断字符串中包含百分号

[JavaScript] js中全局标识正则表达式的lastIndex属性

求大神帮忙写一个只允许是百分数的js正则表达式(从0%至100%,中间数字允许两位小数)。

关于js正则表达式判断格式是否应该跳转