关于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

感谢各位阅读,希望能帮助到大家。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值