为什么使用正则test( )第一次是 true,第二次是false?

javascript 使用正则test( )第一次是 true,第二次是false 主要介绍了使用正则test( )第一次是 true,第二次是false的相关资料,需要的朋友可以参考下 立即下载

1.前言


今天朋友问我一个问题,我现在需要多次匹配同一个内容,但是为什么我第一次匹配,直接是 true,而第二次匹配确实 false 呢?

var s1 = "MRLP";
var s2 = "MRLP";
var reg = /mrlp/ig;
console.log(reg.test(s1));
console.log(reg.test(s2));

这时候你会发现,我们在连续使用一个正则匹配其他字符串的时候,第一次匹配是 true,而第二次匹配则是 false。

等等,WHT?我匹配的是 MRLP,而且我还特意加上i 用于不区分大小写,可以为什么第一次可以正常匹配,第二次就不行了呢?

这也就是我今天要跟大家说的,关于 JS 中的 lastIndex。

2. lastIndex

在开始讲解之前,首先先带大家简单回顾一下 JS中正则表达式的使用方式。

JS 中正则表达式的使用方式有两种:

第一种是正则表达式对象的方法,常用方法有两个。

  • exec(str) : 检索字符串中指定的值。返回找到的值,并确定其位置
  • test(str) : 检索字符串中指定的值。返回 true 或 false

第二种是字符串对象的方法,常用方法有四个。

  • match(regexp) : 找到一个或多个正则表达式的匹配
  • replace(regexp) : 替换与正则表达式匹配的子串
  • search(regexp) : 检索与正则表达式相匹配的值
  • split(search) : 把字符串分割为字符串数组

而这些方法和咱们今天所说的 lastIndex 有什么关系呢?

lastIndex 属性用于规定下次匹配的起始位置。

上次匹配的结果是由方法 RegExp.exec( ) 和 RegExp.test( ) 找到的,它们都以 lastIndex 属性所指的位置作为下次检索的起始点。

这样,就可以通过反复调用这两个方法来遍历一个字符串中的所有匹配文本。

而且需要注意,该属性只有设置标志 g才能使用。

既然已经知道这个东西的形成原因,那么解决起来就非常简单了。

3.解决方案

3.1 第一种解决方案

如上面所述,我们 lastIndex 属性必须要设置 g 标签才能使用。

那么我们在匹配的时候,可以根据情况,直接去掉 g 标签就可以啦。

var s1 = "MRLP";
var s2 = "MRLP";
var reg = /mrlp/i;
console.log(reg.test(s1));  //true
console.log(reg.test(s2));  //true

3.2 第二种解决方案

很多时候,我们必须要执行 全局匹配( g ),这时候就不能使用第一种方案了。

其实,我们的lastIndex 属性是可读可写的。

只要目标字符串的下一次搜索开始,就可以对它进行设置。

当方法 exec() 或 test() 再也找不到可以匹配的文本时,它们会自动把 lastIndex 属性重置为 0。

这样,我们再次执行全局匹配的时候,就不会出现 false 的情况了。

var s1 = "3206064928:MRLP:3206064928";
var s2 = "MRLP";
var reg = /mrlp/ig;
console.log(reg.test(s1));  //true
console.log(reg.lastIndex);   //reg.lastIndex = 15
reg.lastIndex = 0;          //这里我将 lastIndex 重置为 0
console.log(reg.test(s2));  //true
时频分析之短时傅里叶变换(STFT) 本文利用MATLAB自带的spectrogram函数对信号做短时傅里叶变换。首先介绍了短时傅里叶变换(STFT)的背景及意义;其次,对spectrogram函数的用法以及变量的含义做了详细的解释;最后,利用MATLAB编写程序实现了信号的STFT。 阅读详情

相关推荐

手把手教你解决Keil5安装时xerces-c_3_0.dll缺失和0xc000007b报错(附文件下载与路径设置)

本文详细解析了Keil5安装过程中常见的xerces-c_3_0.dll缺失和0xc000007b报错问题,提供了从文件获取、路径设置到系统配置的完整解决方案。同时,文章还涵盖了STM32开发环境的搭建技巧和最佳实践,帮助开发者快速构建稳定的嵌入式开发环境。

weixin_29164497的博客 600

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

前言:今天在做自己的个人项目的时候,使用邮箱的正则表达式进行匹配登录验证时发现用户输入的同一个值在使用同一个正则表达式进行匹配时,会出现第一次匹配为 true,第二次匹配却是false的问题。 我是使用JS 正则表达式对象中的 RegExp.test() 方法进行匹配的,后面查阅了相关资料之后发现了一些端倪。 首先,正则表达式主要分为如下几种: 1、 i (不区分大小写) 2、g (全局匹配) 3...

weixin_42995152的博客 1779

从标准到实战:详解IEC 61000-4-2下的ESD电路防护设计

本文深入解析IEC 61000-4-2标准下的ESD电路防护设计,从静电防护的基础原理到实战应用。详细介绍了接触放电与空气放电的区别、防护器件选型要点(如TVS管和压敏电阻)以及PCB布局的黄金法则,帮助工程师有效提升电子产品的抗静电能力,确保设备在严苛环境下的稳定运行。

weixin_33704234的博客 512

JS正则表达式RegExp.test(),第一次true,第二次false

RegExp.test()异常分析 现象 代码如下: var a= /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/g a.test('192.168.1.1') // true a.test('192.168.1.1') // false 如上的代码,第一次测试返回true,第二次以及之后的调用都会返回false。 原因 这是因为RegExp.test()方法,第一次从位置0开始查找,可以匹配;第二次的查找位置就不是0了,说以就不能匹配了(这个原因是aitangyong说的,

AS_JOPO的专栏 1657

【Flink】FLink session yarn kerberos认证报错 PortUnreachableException: ICMP Port Unreachable

本篇博客是在上一篇博客:【Flink】FLink session yarn kerberos认证报错 KrbException: Cannot locate default realm还没找到原因的时候做的一次尝试。因为项目需要,我们需要对接华为认证的yarn集群,运行flink任务,我们的任务分为两种,yarn pre-job模式和flink session模式。我们在配置文件中配置如下# kerberos认证需要的东西提交任务的脚本如下。

九师兄 1267

快速卷积结构FIR数字滤波器的设计与ARM平台实现

本文提出了一种基于快速卷积结构的FIR数字滤波器设计与实现方案。通过Matlab设计了满足特定指标的低通FIR滤波器,采用重叠-保存法和重叠-相加法两种快速卷积算法,将计算复杂度从O(N·M)降低到O(NlogN)。详细介绍了滤波器系数生成、性能验证流程,并提供了ARM平台C语言实现的关键技术,包括定点量化处理。实验结果表明,该方法能有效滤除混合信号中的高频干扰,保留目标1kHz正弦信号,验证了设计方案的有效性。

huanghm88的专栏 123

JS正则RegExp.test(),第一次true,第二次false

RegExp.test()异常分析 现象 代码如下: const reg= /^[0-9]+$/g; reg.test('123abcdef'); // true reg.test('123abcdef'); // false 如上的代码,第一次测试返回true,第二次以及之后的调用都会返回false。 原因 这是因为RegExp.test()方法,第一次从位置0开始查找,可以匹配;第二次的查找位置就不是0了,说以就不能匹配了(加上了【g】修饰符才会有这个问题,第二次会从第一次匹配的位置后面开始查找,即l

qq_36306693的博客 1236

微信小程序 - 最新详细实现模板消息订阅通知功能,给用户微信发送“服务通知“模板消息并点击进入跳转到小程序页面路由,订阅消息通知详细后台申请流程及示例代码,解决授权申请弹框被拒绝后无法调起、常见报错!

微信小程序,vue2,vue3,模板消息,订阅通知,服务通知,小程序模板通知,订阅微信模板消息功能,唤起模板消息订阅弹框并发送服务通知,消息订阅与模板消息发送,一次性订阅,长期永久订阅,申请模板id,详细示例代码教程,配置流程,消息模板,模板ID,用户收不到消息,订阅了通知但微信不来服务通知,报错,小程序平台模板消息订阅功能,唤起订阅模板消息弹框,订阅模板消息发送服务通知功能,如何做模板消息订阅,一直收不到通知,用户通过弹窗订阅,订阅消息,无法打开申请授权弹框,用户拒绝/关闭后,如何引导用户再开启,拒绝后怎

🏆 前端领域优质创作者 5329

js正则表达式test第一次为true,第二次为false

https://blog.youkuaiyun.com/ken_ding/article/details/79929311

baidu_39305094的博客 3783

【花雕学编程】Arduino ESP32 SPP 之使用Servo库控制360度舵机正反转

使用 Servo 库控制 360 度舵机的正反转是 Arduino ESP32 SPP 应用中的一个重要案例,具有简易控制接口、灵活速度调节和高兼容性等特点,广泛应用于机器人、自动化装置和动态艺术等领域。在第三个案例中,使用map()函数将用户输入的速度参数(范围0-100)映射到舵机控制的角度(0-180),使得用户能够以更人性化的方式控制舵机速度。5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。

雕爷学编程 1469

AIoT 在线工程实训平台案例——智能家居

AIoT 在线工程实训平台案例——智能家居的操作步骤

m0_53608652的博客 1431

js正则的test方法一会返回true一会返回false

问题 在使用js正则的test方法时,一会返回true一会返回false。 如图: 原因 参考 MDN Web Docs 文档 如果正则表达式设置了全局标志,test() 的执行会改变正则表达式 lastIndex 属性。连续的执行test()方法,后续的执行将会从 lastIndex 处开始匹配字符串,(exec() 同样改变正则本身的 lastIndex 属性值). 下面的实例表现了这种行为: var regex = /foo/g; // regex.lastIndex is at 0 re

weixin_45337170的博客 2482

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

关于JS正则表达式中g模式下test出现true/false交替

文章中的有些东西来自Franky大神的文章<浏览器中的 正则表达式陷阱>. Franky原文地址 http://www.vilic.info/blog/archives/531 试考虑如下代码: var re = /^\w$/g; re.test('a'); //返回true re.test('b'); //还是true吗? 猜猜返回值都是什么呢? 如果你已经阅读了Franky大...

aliven1的博客 1120

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

修复相同正则RegExp使用exec或者test交替返回true和false

新写一个正则,比如,在调用exec和test方法时交替返回true和false,乍一看还以为正则出了什么问题。

wzp20092009的博客 349

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【神奇的BUG】在使用正则表达式时,结果明明是 true,不走 if 却走 else,但是此时既不是 true也不是false,请看我如何狡辩

前言 在进行需求开发时,碰到了一个神奇的、莫名的Bug。 在项目中,我用到了正则表达式,出于职业操作,我先把它声明定义出来,没毛病吧。 然后继续,我要判断一下我的输入是否符合当前的正则规则。 此时,神奇的事情发生了。。。 我输入的内容正则表达式判断结果我 true,但是 if 的判断结果却是 false 走了 else WHAT???? 甚是疑惑,一度以为是我眼花了,那先上问题代码 代码 let value = "0"; const regExp = /\d/g; // \d => 匹配一个数字字

XH_jing的博客 1697

url格式正则—test同一个内容时结果出现true和false交替问题

test( ) : 检索字符串中指定的值。返回 true 或 false function fn(url) { var objExp=new RegExp('\(https?:\/\/\\S+\)\(?=\\s|$\)','gi'); console.log(objExp.test(url),objExp.lastIndex); objExp.lastIndex = 0 // 归零 if(objExp.test(url)){ console.log("网址正确!");

weixin_45695200的博客 855

正则表达式中test()方法

test() 方法是正则表达式的一个方法,用于检测一个字符串是否匹配某个模式. test 方法检查字符串是否与给出的正则表达式模式相匹配,如果是则返回 true,否则就返回 false。 每个正则表达式都有一个 lastIndex 属性,用于记录上一次匹配结束的位置. 语法:regexp.test(str) 在全局匹配模式下 对于同一个正则对象重复调用就会出现下一次的匹配位置从上一次匹配结束的位置开始,解决方法重置lastIndex为0 let reg = /^[\d]{2}$/g; let str

qq_42526440的博客 9203

js 正则表达式 test()方法

test() 方法是正则表达式的一个方法,用于检测一个字符串是否匹配某个模式. test 方法检查字符串是否与给出的正则表达式模式相匹配,如果是则返回 true,否则就返回 false。 每个正则表达式都有一个 lastIndex 属性,用于记录上一次匹配结束的位置. 语法:regexp.test(str)  在全局匹配模式下 对于同一个正则对象重复调用就会出现下一次的匹配位置从上一次匹配...

夏朵朵的博客 5万+

JS 正则判断有时候是true有时候是false

js正则 有时 true 有时false问题

weixin_43845059的博客 388

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

前言:今天在做自己的个人项目的时候,使用邮箱的正则表达式进行匹配登录验证时发现用户输入的同一个值在使用同一个正则表达式进行匹配时,会出现第一次匹配为 true,第二次匹配却是false的问题。 我是使用JS 正则表达式对象中的 RegExp.test() 方法进行匹配的,后面查阅了相关资料之后发现了一些端倪。 首先,正则表达式主要分为如下几种: 1、 i (不区分大小写) 2、g (全局匹配) 3、m (多行匹配) 而在设置为 g 标志时使用 RegExp.test() 和 RegExp.exec() 两

yexuanbaby的专栏 989

关于JS正则表达式中g模式下test出现true/false交替的个人见解

原文链接:http://bbs.blueidea.com/thread-2996104-1-1.html(出处: 经典论坛) 文章中的有些东西来自Franky大神的文章. Franky原文地址 http://www.vilic.info/blog/archives/531 试考虑如下代码: var re = /^\w$/g; re.test('a'); //返回tru

changhuzhao的专栏 2737

js正则表达式test方法

test() 方法是正则表达式的一个方法,用于检测一个字符串是否匹配某个模式.test 方法检查字符串是否与给出的正则表达式模式相匹配,如果是则返回 true,否则就返回 false。每个正则表达式都有一个 lastIndex 属性,用于记录上一次匹配结束的位置.语法:regexp.test(str) 手机号验证:!/^[1][3,4,5,7,8][0-9]{9}$/.test(thi...

weixin_30826095的博客 191

正则 test 方法失效

有时候再开发过程中需要重复使用 test() 进行验证,如果发现 test() 方法一会儿出现 true, 一会儿会冷不丁的出现一个 false,这是为啥呢? 因为正则后边加了一个 /g , 写过正则的人应该都清除,/g 的意思是全局匹配,所以在用 test() 进行判断时。内部会有一个 lastIndex 来记录上一次最后匹配的位置,当重复调用的时候,会从继续从 lastIndex 所记录的位...

weixin_30443895的博客 580

详解lastindex,正则test()与全局匹配g偶遇,带来一会true一会false的坑

一、简单的需求与奇怪的问题 周一接到需求文档,产品分类页的输入框,需要加一个智能下拉提醒的功能,大概就是用户输入啥,找到符合输入字段的产品名,进行下拉推荐,同时将此字段标红,有点类似于百度搜索的智能提醒。 实现流程图一画,逻辑一理,胸有成竹就开始写代码了,然后在字段正则匹配时,却遇到一件很诡异的事情,我来拿一个简单的例子还原。 let arr = ["hello",'echo','dem...

weixin_30267691的博客 304
上一篇: 工作一到三年的你,遇到能力上的“瓶颈”了么?
下一篇: 前端面试中的常见的算法问题
MR_LP
博客等级 码龄11年 236粉丝 89原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值