为什么使用正则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
Windows 11 24H2 外接显卡坞兼容性实测:3步解决USB设备失效 本文详细解析了Windows 11 24H2系统下外接显卡坞导致USB设备失效的问题,并提供了三步终极解决方案:驱动预解压与手动更新、电源管理设置调整、优化的设备连接顺序。通过雷电3接口的兼容性优化,帮助用户解决键盘鼠标卡死等常见问题,提升外接显卡坞的稳定性与性能。 阅读详情

相关推荐

微信支付V2,jsapi支付拉起收银台报错:调用支付JSAPI缺少参数:total_fee

拉起收银台报错

m0_54355172的博客 3873

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

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

weixin_42995152的博客 1779

Docker 与容器技术的未来:从 OCI 标准到 eBPF 的演进

OCI 的核心目标是创建一个开放的、厂商中立的容器技术标准。这意味着,只要一个容器镜像符合 OCI 镜像格式规范,它就可以在任何符合 OCI 运行时规范的容器运行时上运行。eBPF 是一种革命性的技术,它允许在 Linux 内核中安全地运行沙盒程序,而无需修改内核源代码或加载内核模块。这些程序可以注册到内核中的各种事件点(如网络包到达、系统调用、函数调用/返回),并在事件发生时执行自定义逻辑。核心思想是:在不将数据复制到用户空间的情况下,程序可以直接在内核中处理数据,极大地提高了效率和性能。

专栏 1383

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

移远EC800M CAT1模块HTTP POST实战:从AT指令到OneNet平台数据上报(附STM32代码)

本文详细介绍了移远EC800M CAT1模块通过AT指令实现HTTP POST数据上报到OneNet平台的完整流程,包含STM32实战代码。内容涵盖PDP上下文激活、HTTP服务配置、JSON数据包构建等关键技术要点,并提供硬件连接、状态机设计和错误处理等实用方案,助力开发者快速实现物联网设备稳定数据传输。

weixin_42565652的博客 508

『言善信』Fiddler工具 — 1、Fiddler介绍与安装

文章目录1、Fiddler简介2、Fiddler功能3、Fiddler工作原理4、Fiddler安装 1、Fiddler简介 Fiddler是强大的抓包工具之一,它能记录所有客户端和服务器之间的HTTP和HTTPS请求,是web调试的利器。 Fiddler是位于客户端和服务端之间的HTTP代理,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改。 Fiddler可以抓取支持HTTP代理的任意程序的数据包,如果要抓取https会

繁华似锦Fighting 1468

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

AI Agent辅助企业财务分析与预测

企业财务分析与预测是企业管理中至关重要的环节,准确的财务分析与预测能够帮助企业管理者做出明智的决策,合理规划资源,降低风险。然而,传统的财务分析与预测方法往往依赖于人工经验和简单的统计模型,存在效率低、准确性差等问题。随着人工智能技术的飞速发展,AI Agent作为一种智能的软件实体,能够自主地感知环境、做出决策并采取行动,为企业财务分析与预测带来了新的解决方案。

AI天才研究院 921

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

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

baidu_39305094的博客 3783

23、管状剪纸结构的研究与功能生成连杆机构的综合设计

本文研究了管状剪纸结构的压缩运动特性,通过剪纸技术将非刚性可折叠的Yoshimura和Kresling折纸结构转化为刚性可折叠结构,并提出径向可闭合剪纸(RC-kiri)构型。推导了位移与折叠角之间的数学关系,设计了带外部LET接头的RC-kiri模型,建立了力-位移理论模型并通过Abaqus进行有限元验证,制作了3D打印物理模型以测量直径变化。同时,研究了四杆和六杆功能生成连杆机构的综合设计方法,基于负闭合运动链和最小二乘法实现函数生成。结果表明理论、仿真与实验整体吻合良好,误差来源得到分析,为机器人、机

nokia的博客 167

YOLOv8改进:注意力系列篇 |高效的通道先验卷积注意力(CPCA) | 中科院 2023.6

高效的通道先验卷积注意力(CPCA)方法,支持注意力权重在通道和空间维度上的动态分布;

会AI的学姐 2043

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

修改Windows hosts文件的解决方案

本文主要介绍了修改Windows hosts文件解决方案,希望能对新手有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 安装软件 2.2 修改hosts文件

weixin_43178406的博客 1万+

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

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

wzp20092009的博客 349

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

XH_jing的博客 1697

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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、付费专栏及课程。

余额充值