首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

与lastIndex匹配的RegExp会导致无限循环

是因为正则表达式的lastIndex属性在全局匹配模式下会影响下一次匹配的起始位置。当一个正则表达式使用全局匹配模式(即带有"g"标志)进行匹配时,每次匹配完成后,lastIndex属性会被设置为当前匹配的结束位置的下一个位置。

如果一个正则表达式的匹配结果可以在字符串中找到多个重叠的位置,而且正则表达式的模式中又包含了lastIndex属性的匹配,那么在循环中使用该正则表达式进行匹配时,会导致无限循环。

例如,考虑以下代码片段:

代码语言:javascript
复制
const regex = /a/g;
const str = "aaa";

let match;
while ((match = regex.exec(str)) !== null) {
  console.log(`匹配到了 ${match[0]},下一次匹配从索引 ${regex.lastIndex} 开始`);
}

上述代码中,正则表达式/a/g会匹配字符串"aaa"中的所有"a"字符。在第一次循环中,匹配到了第一个"a"字符,lastIndex被设置为1。然后,正则表达式从索引1开始继续匹配,又匹配到了第二个"a"字符,lastIndex被设置为2。接着,正则表达式从索引2开始继续匹配,又匹配到了第三个"a"字符,lastIndex被设置为3。由于字符串中只有三个"a"字符,正则表达式再次从索引3开始匹配时,没有匹配到任何内容,返回null。然而,由于lastIndex属性被设置为3,循环会继续进行,导致无限循环。

为了避免这种情况,我们可以在每次循环中手动重置lastIndex属性,或者使用非全局匹配模式(即不带"g"标志)进行匹配。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

js正则表达式(一)

调用 RegExp 对象 r test() 方法,并为它传递字符串 s,这个表示式是等价:(r.exec(s) != null)。 exec 返回一个数组,其中存放匹配结果。...因此我们可以这么说,在循环中反复地调用 exec() 方法是唯一一种获得全局模式完整模式匹配信息方法。...最新标准已废弃 支持正则表达式 String 对象方法 search stringObject.search(regexp) 返回值:stringObject 中第一个 regexp匹配子串起始位置...split stringObject.split(separator,howmany) 匹配匹配项,函数未return,返回undefined,即符合函数返回值 lastIndex指向问题 使用带有...标志考虑到,从而导致匹配失败) regex.lastIndex; // 0 (匹配失败后重置) multiline multiline 是一个布尔对象,如果使用了 “m” 标志,则返回 true;否则

3.8K40

全面学习正则表达式,从原理到实战

下面是我对正则理解: 正则就是用有限符号,表达无限序列,殆已!...,都优先匹配上限而不是下限 a{1, 3} // 匹配字符串'aaa'的话,匹配aaa而不是a 有时候这不是我们想要结果,可以在量词后面加上?... // 匹配 123 或 456 或 789 分组引用 分组是正则中非常强大一个功能,可以让上面提到量词作用于一组字符,而非单个字符,分组语法是圆括号包裹(xxx) (abc){2} // 匹配...b", index: 0, input: "abc"] RegExp.$_ // abc 上一次匹配字符串 RegExp.$1 // b 上一次匹配捕获分组 RegExp.input // abc... 上一次匹配字符串 RegExp.lastMatch // ab 上一次匹配成功字符 RegExp.length // 2 上一次匹配数组长度 实例属性 正则表达式实例上也有一些属性 flags

44720

使用 GPT 写代码:高亮页面关键字

="highlight">$&'); 在 innerHTML 匹配关键字,将关键字替换成高亮 span,然后重新替换 innerHTML 这样实现虽然非常简单,但会导致 shadowRoot...对于每个文本节点,我们使用 exec 方法来查找匹配指定文本子串,并将每个匹配子串用黄色高亮显示。...在 TreeWalker 遍历过程中修改节点,导致遍历到新节点,从而可能会出现意外结果。为了避免这种情况,我们可以将需要修改节点保存到一个数组中,在遍历完成后再对这些节点进行修改。...在遍历过程中调用 deleteContents 和 insertNode 方法,导致遍历到新节点,从而可能会出现意外结果。...highlightText,已高亮节点,仍然创建 span,这就会导致 span 重复嵌套。

30530

「思维导图学前端 」初中级前端值得收藏正则表达式知识点扫盲

当在循环中用到正则对象lastIndex判断终止条件时,一定不要使用直接量正则表达式写法,否则每次循环lastIndex都会被重置为0,这是因为每次执行字面量正则表达式时,都会转换为一个新RegExp...对象,相应lastIndex当然也变成0。...如果正则表达式设置了全局标志g,执行test()会改变RegExp.lastIndex属性,用于记录上次匹配字符起始索引。...lastIndex随着exec()和test()执行而更新 var reg = /\d/g reg.lastIndex // 0 reg.test('123456') reg.lastIndex /...exec()不同点在于,如果match方法传入正则表达式带了标识g,则将返回完整正则表达式匹配所有结果,但不会返回捕获组。

41440

使用 GPT 写代码:高亮页面关键字

="highlight">$&');在 innerHTML 匹配关键字,将关键字替换成高亮 span,然后重新替换 innerHTML这样实现虽然非常简单,但会导致 shadowRoot...对于每个文本节点,我们使用 exec 方法来查找匹配指定文本子串,并将每个匹配子串用黄色高亮显示。...在 TreeWalker 遍历过程中修改节点,导致遍历到新节点,从而可能会出现意外结果。为了避免这种情况,我们可以将需要修改节点保存到一个数组中,在遍历完成后再对这些节点进行修改。...在遍历过程中调用 deleteContents 和 insertNode 方法,导致遍历到新节点,从而可能会出现意外结果。...highlightText,已高亮节点,仍然创建 span,这就会导致 span 重复嵌套。

1.8K20

正则扩展

如果RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。而且,返回正则表达式忽略原有的正则表达式修饰符,只使用新指定修饰符。...ES6 将这 4 个方法,在语言内部全部调用RegExp实例方法,从而做到所有正则相关方法,全都定义在RegExp对象上。...y修饰符同样遵守lastIndex属性,但是要求必须在lastIndex指定位置发现匹配。...# RegExp.prototype.sticky 属性 y修饰符相匹配,ES6 正则实例对象多了sticky属性,表示是否设置了y修饰符。...“后行断言”实现,需要先匹配/(?<=y)x/x,然后再回到左边,匹配y部分。这种“先右后左”执行顺序,所有其他正则操作相反,导致了一些不符合预期行为。

93520

基础 | 正则表达式(JS)-入门篇

字符串方面 String方法中有四种方法支持正则表达式 1、search() 该方法是最简单方法了,它以正则表达式为参数,返回第一个匹配子串开始字符位置,如果没有任何匹配的话,返回-1。...multiline同理,代表m是否多行匹配lastIndex是一个可读写整数,存储下一次开始匹配位置。...PS:无论正则表达式是否具有g标示,exec返回数组类型都是一样,但是它会把lastIndex属性设置到紧接匹配子串字符位置,以便下次继续匹配,因为这点特殊性,exec可以遍历调用。...PS:这个要小心一个坑,如果你用这2个方法匹配多个字符串,而每次匹配一个字符串又没有匹配完时,lastIndex属性不会自己重置为0。下面是例子。...当在循环中有重复正则匹配时候,用编译后正则表达式执行起来,效率更高(前提是正则表达式是固定,如果你每次循环都需要动态适配新正则的话,是没有效果)。

27510

JavaScript中正则表达式

,或检索正则表达式相匹配子字符串,并返回第一个匹配子字符串位置 console.log('JAVA is not javascript'.search(/java/i));//0 注意:search...()方法不支持全局检索,因为他忽略正则表达式参数中修饰符g replace(): 用于检索替换操作,接收两个参数,第一个是正则表达式,第二个是要进行替换字符串,该方法可以全局匹配 console.log...is not javascrip match(): 用于检索字符串中正则表达式匹配结果,参数必须是正则表达式,返回一个由匹配结果组成数组 在match方法中如果正则表达式设置修饰符g,则返回数组是字符串中所有匹配结果...对象属性 RegExp 对象包含5个属性 属性 描述 global 只读布尔值,用于说明表达式是否带有修饰符g ignoreCase 只读布尔值,用于说明表达式是否带有修饰符i lastIndex...,在全局匹配模式下,exec方法会设置lastIndex 属性值,exec()下次检索lastIndex属性指示字符处开始检索 var pattern = /java/ig; var text

51920

红宝书 📒 5.2 基本引用类型- RegExp

RegExp 前言 正则表达式是很重要。几乎每一门语言都会去支持正则表达式,ECMAScript是通过RegExp类型来支持正则。...匹配模式标记 g :全局模式,表示查找字符全部内容 i :不区分大小写,表示查找匹配时忽略pattern和字符串大小写 m :多行模式,表示查找到一行文本末尾继续查找 y :粘附模式,表示只查找从...lastIndex开始及之后字符串。...5.2.2 RegExp实例方法 这里我们介绍两个方法 exec() 和 test() exec() 参数:要应用模式字符串 需求:内部匹配项"and baby",内部 "and dad" 或...构造函数属性 通过以下属性可以提取出exec()和test()执行操作相关信息 input 缩写 $_ 最后搜索字符串 lastMatch 缩写 $& 最后匹配文本 lastParen

38750

记录一次JavaScript正则诡异经历

/).)*'; } return block; }); return new RegExp(`^${regBlock.join('/')}$`, 'ig'); } 问题 然后在进行调试时候发现一个奇怪现象...连续执行test()方法,后续执行将会从 lastIndex 处开始匹配字符串,(exec() 同样改变正则本身 lastIndex属性值)....通过文档说明得知,当我们正则表达式带有g标识进行全局匹配时,匹配成功后,regex实例中会有一个lastIndex属性去记录本次命中正则最后一位下标+1,用于在下一次调用test时候,从lastIndex...从而导致问题。 并且通过验证得出,当匹配成功后,lastIndex记录下一次开始位置,但是当匹配失败,lastIndex归零从头开始。...至此这一次被坑经历耗时60分钟左右,耽误了吃饭最佳时间,导致饭堂菜都快没有。但是同时也收获到JavaScript在正则上一个容易被忽略坑。好像也不亏。

26120

JavaScript正则表达式(Regular Expression):RegExp对象

第二部分:RegExp对象属性和方法 2.1属性 2.1.1:修饰符,返回布尔值 ignoreCase:忽略大小写;i;属性只读 global:全局匹配;g;属性只读 multiline:多行匹配;m...index:模式匹配成功第一个位置(0开始计数); input:参数字符串 如果正则表达式中包含圆括号(即"组匹配"),返回数组包含多个成员;第一个成员是整个匹配成功结果,第二个成员是圆括号里面匹配成功结果...split():按照给定规则对字符串进行分割;返回一个数组,包含分割后各个成员 3.1:String.prototype.match():字符串match()方法正则对象exec()方法十分相似...:匹配成功返回数组;匹配失败返回null; 区别:当正则表达式带有g修饰符,match()返回所有结果;而exec()返回一个结果。...3.2 String.prototype.search():返回第一次匹配成功在整个字符串位置;否则返回-1 同样,设置lastIndex属性对search()无效;并且search()忽略g修饰符

85250

JavaScript正则表达式

’要翻倍) var pattern = new RegExp('\\t'); 四、正则表达式锚字符 ^:匹配字符串开头,在多行检索中,匹配一行开头 $:匹配字符串结尾,在多行检索中,匹配一行结尾...: …):只组合,把项组合到一个单元,但是不记忆改组相匹配字符 \n:和第n个分组第一次匹配字符相匹配,组是圆括号中子表达式(也有可能是嵌套),组索引是从左到右左括号数,“(?...String方法 search():它参数是一个正则表达式,返回第一个匹配子串起始位置,如果没有匹配子串就返回-1。...,如果不是则通过 RegExp 转换,返回是一个由匹配结果组成数组。...如果没有找到任何匹配就返回 null,找到了匹配就返回一个数组,这个数组第一个元素包含正则表达式相匹配字符串,余下元素是圆括号内子表达式相匹配子串,不论正则表达式是否有修饰符g,都会返回一样数组

80610

JavaScript之正则表达式使用方法详细介绍

常见正则表达式属性 三种匹配规则 首先介绍一下正则表达式三种匹配规则: 匹配规则符号 规则含义 i 匹配时忽略大小写 g 执行全局匹配(匹配整个语句,而非匹配到第一个目标后终止) m 执行多行匹配...regexp.test(str) alert(regexp.lastIndex) regexp.test(str) alert(regexp.lastIndex...exec()方法返回是一个字符串数组: 当整句匹配失败时,返回一个null空数组; 否则,有:数组第0个元素存储是整句匹配字符串,第1个元素存放是第一个引用型分组(子表达式)匹配字符串...1. search(): 检索字符串中指定子字符串或正则表达式相匹配子字符串。...str.match(Regexp/String) // 3.replace() : 用于在字符串中用一些字符替换另一些字符,或替换一个正则表达式匹配子串 str.replace(yourRegexp

90420

JavaScript 高级程序设计(第 4 版)- 基本引用类型

# RegExp实例方法 exec(),主要用于配合捕获组使用,参数是要应用模式字符串 如果找到了匹配项,则返回包含第一个匹配信息数组 如果没有找到匹配项则返回null 返回数组实例包含两个额外属性...:index和input index是字符串中匹配模式起始位置 input是要查找字符串 数组第一个元素时匹配整个模式字符串,其他元素时表达式中捕获组匹配字符串 如果模式中没有捕获组,则数组只包含一个元素...(RegExp.lastParen); // s 捕获组上一次匹配 } # 模式局限 缺少特性 \A和\Z锚(分别匹配字符串开始和末尾) 联合及交叉类 原子组 x(忽略空格)匹配模式 条件式匹配...match(),返回第一个元素时整个模式匹配字符串,其余元素则是表达式中捕获组匹配字符串 search(),返回模式第一个匹配位置索引 localeCompare() # 单例内置对象...精度因浏览器、操作系统、指令集和硬件而异。

70220
领券