js正则属性详解 外加踩过的一个的坑(lastIndex)

日常踩坑记录-js正则匹配规则之lastIndex 复盘时间到 好家伙,又到了日常的复盘时间。来复盘一下我刚碰到的这个正则的问题。 img-1img-2先看上面两张图,暂且不说这个正则是起什么用的,图img-1里我用/\$\{(.*)\}/g这个正则先后去调用test方法和exec方法去匹配"${}"这个字符串。test返回true,exec返回一个由匹配到的字符串和匹配到的分组组成的数组,这两个方法都正常的返回了结果。在图img-2里我把这个正则用变量保存了起来(正则实质上也是对象,图img-1里的两个正则看似相同,其实是两个不同地址的正则对象,只是想 阅读详情

###每个RegExp对象都包含5个属性,source、global、ignoreCase、multiline、lastIndex\color{red}{lastIndex}lastIndex。
先简单的介绍下五个属性
####1.source:是一个只读的字符串,包含正则表达式的文本。

const reg = /haha/;
console.log(reg.source);  //haha

####2. global:是一个只读的布尔值,判断正则表达式是否带有修饰符g。
修饰符g,是全局匹配的意思,检索字符串中所有的匹配。

var reg = /haha/;
console.log(reg.global); //返回 false

var reg = /haha/g;
console.log(reg.global); //返回 true

####3. ignoreCase:是一个只读的布尔值,判断正则表达式是否带有修饰符i。
修饰符i,说明模式匹配是不区分大小写的。

var reg = /haha/;
console.log(reg.ignoreCase); //返回 false

var reg = /haha/i;
console.log(reg.ignoreCase); //返回 true

####4. multiline:是一个只读的布尔值,判断正则表达式是否带有修饰符m。
修饰符m,用以在多行模式中执行匹配,需要配合^ 和 $ 使用,使用^ 和 $ 除了匹配整个字符串的开始和结尾之外,还能匹配每行的开始和结尾。

var reg=/haha/;
reg.multiline; //返回false

var reg=/haha/m;
reg.multiline; //返回true

####5. lastIndex\color{red}{lastIndex}lastIndex:是一个可读/写的整数,如果匹配模式中带有g修饰符,这个属性存储在整个字符串中下一次检索的开始位置,这个属性会被exec( ) 和 test( ) 方法用到。
lastIndex\color{blue}{lastIndex}lastIndex这个属性可能会踩坑的0.0。会导致有时候返回值出错有时候正确。 这个坑的错误是建立在g也就是全局的基础之上的。

  • exec( )方法是在一个字符串中执行匹配检索,如果它没有找到任何匹配,它就返回null,但如果它找到了一个匹配,它就返回一个数组(数组参数第一个就是reg.source ,第二个是index,开始查询位置,第三个是 str)。
  • test() test( )方法,它的参数是一个字符串,用test( )对某个字符串进行检测,如果包含正则表达式的一个匹配结果,则返回true,否则返回false。
const reg = /haha/g;
const str = "haha haha"
console.log(reg.exec(str)); //["haha", index: 0, input: "haha haha", groups: undefined]
console.log(reg.lastIndex); //4

console.log(reg.exec(str)); // ["haha", index: 5, input: "haha haha", groups: undefined]
console.log(reg.lastIndex); //9

console.log(reg.exec(str)); //null
console.log(reg.lastIndex); // 0

/*它将把当前正则表达式对象的lastIndex属性设置为紧挨着匹配子串的字符位置,当同一个正则表达式第二次调用exec( ),它会将从lastIndex属性所指示的字符串处开始检索,如果exec( )没有发现任何匹配结果,它会将lastIndex重置为0。*/

console.log(reg.exec(str)); // ["haha", index: 0, input: "haha haha", groups: undefined]
console.log(reg.lastIndex); //4
const str="haha haha";
const reg=/haha/g;

console.log(reg.test(str)); //打印 true

console.log(reg.lastIndex);
//打印4,因为匹配到了JavaScript,所以设置lastIndex为匹配结果紧挨着的字符位置

console.log(reg.test(str)); //打印 true

console.log(reg.lastIndex);
//打印9,因为匹配到了JavaScript,所以设置lastIndex为匹配结果紧挨着的字符位置

console.log(reg.test(str));
//打印 false,因为从lastIndex位置检索字符串,已经没有匹配结果了

console.log(reg.lastIndex);
//打印0,因为没有匹配到结果,所以将lastIndex重置为0

不想踩坑的话 。如果在一个字符串中完成了一次模式匹配之后要开始检索新的字符串,就必须手动地把 lastIndex 属性重置为 0。

例如:

const str="haha haha";
const reg=/haha/g;
console.log(reg.test(str)); //打印 true
reg.lastIndex=0;
console.log(reg.lastIndex);
//打印0,
console.log(reg.test(str)); //打印 true
reg.lastIndex=0;
console.log(reg.lastIndex);
//打印0,

console.log(reg.test(str));
//打印 true
reg.lastIndex=0;
console.log(reg.lastIndex);
//打印0,

在例如每次都new RegExp();构造一个新的 RegExp对象

const str="haha haha";
let reg = new RegExp("haha","g");

console.log(reg.test(str)); //打印 true
console.log(reg.lastIndex);
//打印4,
reg = new RegExp("haha","g");
console.log(reg.test(str)); //打印 true
console.log(reg.lastIndex);
//打印4,

reg = new RegExp("haha","g");
console.log(reg.test(str));
//打印 true
console.log(reg.lastIndex);
//打印4,
JavaScript-正则表达式方法(RegExp) RegExp对象用于将文本与一个模式匹配。有两种方法可以创建一个RegExp对象:一种是字面量,另一种是构造函数。字面量由斜杠(/)包围而不是引号包围。构造函数的字符串参数由引号而不是斜杠包围。 阅读详情

相关推荐

MATLAB锂离子电池伪二维(P2D)模型实现

锂离子电池伪二维(P2D)模型的MATLAB实现。该模型基于Newman等人提出的经典电化学模型,考虑了固液相扩散、电荷守恒和电化学反应动力学。

hie98894的博客 1931

javascript字符串方法indexOf、lastIndexOf 方法的使用

indexOf、lastIndexOf语法 string.indexOf(searchvalue,start) string.lastIndexOf(searchvalue,start) 说明: string:被检索的字符串 searchvalue:需检索的字符串值(必需) start:检索开始的位置(可选值) indexOf和lastIndexOf语法是一样的,但查找的顺序相反,indexOf是从前往后查,而lastIndexOf是从后往前查。 返回值:如果检索到就返回所在的位置,没有检索

编程界明世隐的博客 5630

STC8G1K08A的10位PWM避坑指南:为什么你的占空比调节总失效?(附寄存器操作时序图)

本文深入剖析了STC8G1K08A单片机10位PWM功能中占空比调节失效的核心原因,揭示了数据手册未明确指出的寄存器操作时序陷阱。通过对比错误与正确配置的波形,文章指出关键在于更新占空比高2位前需临时关闭PWM输出,并提供了经过验证的安全操作宏与函数库,帮助开发者彻底解决此问题,实现0%-100%的平滑控制。

yyy34的博客 749

无涯教程-Javascript - lastIndex属性函数

lastIndex RegExp 设置了“g”属性的正则表达式,它包含一个整数,该整数指定紧随()和()方法找到的最后一个匹配项之后的字符位置。这些方法使用此属性作为它们进行下一次搜索的起点,exec()和test()在找不到匹配时自动将lastIndex重置为0。

无涯教程 1292

墨刀原型设计工具操作使用指南及实践操作

该指南通过异常场景处理、像素级参数说明、复杂交互示例,覆盖了墨刀操作的全细节,适合从新手到资深用户的进阶学习。结合 PlantUML 思维导图的层级化展示,可快速定位具体功能的操作要点与问题解决方法,真正实现 “照指南即可操作” 的实用价值。

hy行者勇哥的博客 4953

P450酶催化循环的Amber-Gromacs混合模拟实战:从血红素加氧到产物释放

本文详细介绍了针对P450酶完整催化循环的Amber-Gromacs混合模拟实战策略。通过Amber为关键氧合血红素中间体(CPDI)构建精确力场,再利用Gromacs的高效GPU加速进行长时间尺度动力学模拟,完整覆盖从底物结合到产物释放的催化过程,为研究酶催化机制提供了强大的计算工具。

weixin_29201859的博客 315

【JavaScript】indexOf() 和 lastIndexOf() 方法详解

在 JavaScript 中,`indexOf()` 和 `lastIndexOf()` 方法是处理字符串和数组时非常常用的两个方法。它们分别用于查找指定元素的第一次和最后一次出现的位置。本文将深入解析这两个方法的原理、用法,并通过实例帮助大家更好地理解它们的实际应用。

lph159的博客 4154

第一部分:VTK基础入门(第1章:VTK简介与概述)

VTK简介与核心特性概述 VTK(Visualization Toolkit)是一个开源的跨平台C++类库,专用于3D计算机图形学、图像处理和科学可视化。由Kitware公司开发,VTK自1993年起源以来,经历了开源化、成熟化和现代化多个发展阶段,现已成为科学可视化的核心工具之一。 VTK的核心特性包括: 管道架构:模块化设计实现数据流管理 丰富的数据支持:处理多边形数据、图像数据等 强大的渲染能力:集成OpenGL,支持多种渲染技术 最新版本VTK 9.4.2增强了现代C++支持,优化了内存管理,并提升

仰望星空的博客 2363

js 踩了正则表达式的大坑!lastIndex属性

正则表达式

qq_45560350的博客 971

Python爬虫实战:全自动采集银行理财产品收益率数据

本文通过Playwright动态爬虫技术,成功实现了对银行理财产品收益率数据的实时采集,并通过 Pandas 数据清洗、SQLite 存储、调度自动化等模块,构建了一个可扩展的银行理财数据抓取系统。理财非儿戏,数据做决策。掌握银行收益信息是我们迈向理性投资的第一步。希望这套工具对你有所帮助!

2201_76125261的博客 1156

Centos7系统添加中文支持(附中文语言包)

这里以centos7.6为例,在安装系统是没有选择中文,之后如果需要添加中文支持。在命令行执行后,会提示启动图形模式失败,转为启动文本模式。文本模式其实和图形模式差不多,操作需要用键盘而不是鼠标。在弹窗后,通过上下键选择Chinese(P.R of China) - 中文(简体):然后,按Tab键选择Yes,点击回车。rebootlocale可以看到系统语言已经变成了zh_CN.utf-8:之后,服务器上的中文名称就可以正常显示正常了。

悦分享 685

JS数组方法:lastIndexOf

前端javascript中lastIndexOf数组方法

不熬夜的臭宝的博客 2009

【PPS便携式移动电源】如何透彻了解便携式移动电源,仅需要十分钟阅读即可

PPS 便携式储能电源的发展前景广阔,受益于户外经济爆发、应急备灾需求提升及 “双碳” 政策支持,全球市场规模预计持续增长,2025 年出货量将达 2380 万台,未来将向大功率大容量、光充一体化、智能化方向发展,还会拓展家庭储能、移动医疗等新场景,同时钠离子电池应用、双向逆变技术升级将进一步推动行业发展。

昔时扬尘处 272

JavaScript正则踩坑——RegExp.test()和RegExp.lastIndex

RegExp.test()和RegExp.lastIndex 首先感谢同学帮助分析问题,最终才找到问题。 话不多说,直接上代码说问题 第一版代码 const result = parent.filter((child: ITree): boolean =>{ console.log(reg.test(child.name) || reg.test(child.id...

Jim Suen 1045

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

正则的lastIndex 属性

简介:正则的lastIndex 属性用于规定下次匹配的起始位置。 注意:该属性只有设置标志 g 才能使用。 上次匹配的结果是由方法 RegExp.exec() 和 RegExp.test() 找到的,它们都以 lastIndex 属性所指的位置作为下次检索的起始点。这样,就可以通过反复调用这两个方法来遍历一个字符串中的所有匹配文本。 注意:该属性是可读可写的。只要目标字符串的下一...

qq_35859392的博客 417

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

慎用正则全局匹配 g,循环时正则匹配的坑!正则的lastIndex属性

循环时进行正则校验 今天在使用正则进行校验的时候遇见了一个很是神奇的问题!经过一段实验感觉更是惊奇,于是在网上寻求帮助之后才发现了原因所在! let reg = /\.jpg/g; let arr = [ 'pic1.jpg', 'pic2.jpg', 'pic3.jpg', 'pic4.jpg', 'pic5.jpg', ]; arr.forEach( i...

weixin_42556438的博客 855

计算机控制技术及应用

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

简单说 正则表达式——要注意lastIndex属性

说明这篇文章,主要和大家聊聊JavaScript中RegExp对象的属性。 解释每个RegExp对象都包含5个属性,source、global、ignoreCase、multiline、lastIndex。 source:是一个只读的字符串,包含正则表达式的文本。 var reg = /JavaScript/; var str = reg.source; //返回 JavaScriptglob

FEWY的博客 1万+

JavaScript RegExp 对象的lastIndex 属性

JavaScript RegExp 对象的lastIndex 属性 说明 该属性存放一个整数,它声明的是上一次匹配文本之后的第一个字符的位置。 上次匹配的结果是由方法 RegExp.exec() 和 RegExp.test() 找到的,它们都以 lastIndex 属性所指的位置作为下次检索的起始点。这样,就可以通过反复调用这两个方法来遍历一个字符串中的所有匹配文本。 该属性是可读可写的。只...

HeMister的博客 620

正则中,关于lastIndex所带来的影响

正则中lastIndex属性介绍以及在实际开发环境中其会带来的影响。

m0_53062068的博客 864

正则中的lastIndex属性

首先大家看下下面的代码 var reg = /\d/; console.log( reg.test("1") ); console.log( reg.test("1") ); 输出都是true。 好的,接下来我们看这段代码 var reg = /\d/g; console.log( reg.test("1") ); console.log( reg.test(...

291

js 关于执行test、exec、match时正则的lastIndex属性

到这里,终于明白了lastIndex置为0的意义。匹配到{{name}},说明此时正则匹配从第八个字符开始,也就是说之前执行 test 时返回结果为true ,将reg.lastIndex改为8,这时的lastIndex 影像了exec的执行,那么是不是这样呢?通过测试发现,match的返回结果与reg的lastindex无关,其实从另一方面也可以窥探一些端倪,test、exec是正则的方法,而match是字符串的方法。运行结果:************

qq_64803883的博客 545

js正则表达式lastIndex

今天在写一个校验ip的正则表达式时,遇到一个问题,表达式匹配本身没有任何问题,但当末尾带上/g时,校验同一个ip,第一次使用test返回的结果是true,但第二次就是false,第三次又是true,仔细一想,记得RegExp对象有一个记录匹配位置的属性,于是上w3school查了一下,果然。RegExpObject.lastIndex以下为w3school上的内容: 该属性存放一个整

wfbob的专栏 3219

在正则中遇到的小坑 --- lastIndex

let reg = /\d\+/g reg.test('1+') reg.test('1+') 以上代码输出什么? 答案是 true false 因为这边正则表达式使用了g标识符,当执行第一次reg.test(‘1+’) 匹配后, reg.lastIndex == 2 在执行第二次匹配的时候, 匹配的起始位置是2,所以就无法匹配正确答案 解决方法是重置l...

yezi_Z的博客 440

正则表达式对象中lastIndex属性

js中正则表达式的使用方式有两种,一种是正则表达式对象的方法,一种是字符串对象的方法,前者有exec(str)、test(str)两个方法,后者有match(regexp)、replace(regexp)、search(regexp)、split(search)四个方法。当作为正则表达式对象的方法使用时,要特别注意它的lastIndex属性。 var regexp = /abcd/g

weixin_37890936的博客 512

正则对象的lastIndex属性

今天在写一个循环里面,通过正则方法test()来验证字符串,遇到了一个坑。在此分享一下采坑过程,也给自己加深个印象。 贴上我的一部分代码: var str1 = '我是在测试'; var p = /[\u4E00-\u9FA5]/g; //匹配中文正则 var arr = str1.split(''); for(var i = 0; i < arr.length; i++) { ...

老夫风清扬的博客 605
上一篇: 基于ngx-echarts和angular-gridster2 做的基于dashboard例子
下一篇: Nginx最基本最常用操作
wen_binObject
博客等级 码龄10年 51粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值