详谈lastIndex对正则结果的影响
前言
今天遇到一个问题,用正则表达式去检查同一个字符串时,交替返回true和false。无奈之下,重新翻了翻权威指南,发现罪魁祸首原来是lastIndex。可在控制台尝试下
let reg = /[\d]/g //undefined reg.test(1) //true reg.test(1) //false
lastIndex
lastIndex在权威指南中是如下解释:它是一个可读/写的整数。如果匹配模式带有g修饰符,这个属性存储在整个字符串中下次索引的开始位置,这个属性会被exec()和test()用到。还是上面的例子,观察下lastIndex属性
let reg = /[\d]/g //有修饰符g //undefined reg.lastIndex //0 reg.test(1) //true reg.lastIndex //匹配一次后,lastIndex改变 //1 reg.test(1) //从index 1 开始匹配 //false reg.lastIndex //0 reg.test(1) //true reg.lastIndex //1
第一次使用test()匹配成功后,lastIndex被设为匹配到的结束位置,就是1;第二次再test()时,从index 1 开始匹配,匹配失败,lastIndex重置为0 。这样就造成了匹配结果与预期不符
解决
1、不使用 g 修饰符
reg = /[\d]/ ///[\d]/ reg.test(1) //true reg.test(1) //true reg.lastIndex //0 reg.test(1) //true reg.lastIndex
2、test()之后手动设置lastIndex = 0
以上这篇详谈lastIndex对正则结果的影响就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。
相关推荐
-
Javascript lastIndex 正则表达式的一个疑惑
看下面这段代码: function test(s){ var reg = /./g; console.log(reg.exec(s)); console.log(reg.lastIndex); var reg = /./g; console.log(reg.exec(s)); console.log(reg.lastIndex); } test("abcd"); test("efgh"); 我以为输出的lastIndex的值应该都是1,但是实际上的输出如下: a 1
-
JS中正则表达式要注意lastIndex属性
说明 这篇文章,主要和大家聊聊JavaScript中RegExp对象的属性. 解释 每个RegExp对象都包含5个属性,source.global.ignoreCase.multiline.lastIndex. source:是一个只读的字符串,包含正则表达式的文本. var reg = /JavaScript/; reg.source; //返回 JavaScript global:是一个只读的布尔值,看这个正则表达式是否带有修饰符g. 修饰符g,是全局匹配的意思,检索字符串中所有的匹配.
-
浅析正则表达式中的lastIndex以及预查
依次写出下列输出内容. var reg1 = /a/; var reg2 = /a/g; console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg2.test('abcabc')); //
-
详谈lastIndex对正则结果的影响
前言 今天遇到一个问题,用正则表达式去检查同一个字符串时,交替返回true和false.无奈之下,重新翻了翻权威指南,发现罪魁祸首原来是lastIndex.可在控制台尝试下 let reg = /[\d]/g //undefined reg.test(1) //true reg.test(1) //false lastIndex lastIndex在权威指南中是如下解释:它是一个可读/写的整数.如果匹配模式带有g修饰符,这个属性存储在整个字符串中下次索引的开始位置,这个属性会被exec()和te
-
浅析lastIndex对正则表达式结果的影响
前言 今天遇到一个问题,用正则表达式去检查同一个字符串时,交替返回true和false.无奈之下,重新翻了翻权威指南,发现罪魁祸首原来是lastIndex.可在控制台尝试下 let reg = /[\d]/g //undefined reg.test(1) //true reg.test(1) //false lastIndex lastIndex在权威指南中是如下解释:它是一个可读/写的整数.如果匹配模式带有g修饰符,这个属性存储在整个字符串中下次索引的开始位置,这个属性会被exec()和te
-
JS 学习总结之正则表达式的懒惰性和贪婪性
exec - > 正则的捕获 每一次捕获的时候都是先进行默认的匹配,如果没有匹配成功的,捕获的结果是null:只有有匹配的内容我们才能捕获到: 捕获的内容格式 1.捕获到的内容是一个数组,数组中的第一项是当前正则捕获的内容 index:捕获内容在字符串中开始的索引位置 input:捕获的原始字符串 var reg = /\d+/; var str = 'woshi2016ni2017'; var res = reg.exec(str); console.log(res) // ['2016',i
-
php ctype函数中文翻译和示例
PHP Ctype扩展是PHP4.2开始就内建的扩展,注意,Ctype系列函数都只有一个字符串类型参数,它们返回布尔值. 复制代码 代码如下: $str = "0.1123";//检查字符串所有字符是否为数字echo "ctype_digit:" . ctype_digit($str); //空//检测是否为数字字符串,可为负数和小数echo "is_numberic:" . is_numeric($str); //1 从上面可以看出ctype
-
详谈jQuery中的一些正则匹配表达式
jQuery常用正则匹配表达式 //整数 "^-?[1-9]\\d*$", //正整数 "^[1-9]\\d*$", //负整数 intege2: "^-[1-9]\\d*$", //数字 num: "^([+-]?)\\d*\\.?\\d+$", //正数(正整数 + 0) num1: "^[1-9]\\d*|0$", //负数(负整数 + 0) num2: "^-[1-9]\\d*|0$&qu
-
ES6正则的扩展实例详解
本文实例讲述了ES6正则的扩展.分享给大家供大家参考,具体如下: 1. RegExp构造函数 ES5中,RegExp构造函数的参数: 参数是字符串,这时第二个参数表示正则表达式的修饰符(flag) 参数是一个正则表示式,这时会返回一个原有正则表达式的拷贝.但是,ES5不允许此时使用第二个参数,添加修饰符,否则会报错. ES6改变了这种行为.如果RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符.而且,返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符
-
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
本文实例讲述了Python3正则匹配re.split,re.finditer及re.findall函数用法.分享给大家供大家参考,具体如下: re.split re.finditer re.findall @(python3) 官方 re 模块说明文档 re.compile() 函数 编译正则表达式模式,返回一个对象.可以把常用的正则表达式编译成正则表达式对象,方便后续调用及提高效率. re 模块最离不开的就是 re.compile 函数.其他函数都依赖于 compile 创建的 正则表达式对象
-
Python3中正则模块re.compile、re.match及re.search函数用法详解
本文实例讲述了Python3中正则模块re.compile.re.match及re.search函数用法.分享给大家供大家参考,具体如下: re模块 re.compile.re.match. re.search re 模块官方说明文档 正则匹配的时候,第一个字符是 r,表示 raw string 原生字符,意在声明字符串中间的特殊字符不用转义. 比如表示 '\n',可以写 r'\n',或者不适用原生字符 '\n'. 推荐使用 re.match re.compile() 函数 编译正则表达式模式,
-
正则应用之 日期正则表达式
1概述 首先需要说明的一点,无论是Winform,还是Webform,都有很成熟的日历控件,无论从易用性还是可扩展性上看,日期的选择和校验还是用日历控件来实现比较好. 前几天在CSDN多个版块看到需要日期正则的帖子,所以整理了这篇文章,和大家一起讨论交流,如有遗漏或错误的地方,还请大家指正. 日期正则一般是对格式有要求,且数据不是直接由用户输入时使用.因应用场景的不同,写出的正则也不同,复杂程度也自然不同.正则的书写需要根据具体情况具体分析,一个基本原则就是:只写合适的,不写复杂的. 对于日期提
-
PHP正则删除HTML代码中宽高样式的方法
本文实例讲述了PHP正则删除HTML代码中宽高样式的方法.分享给大家供大家参考,具体如下: 因工作需要,需要采集html,并把html内容保存到数据库中.为了避免影响使用,宽高样式需要删除.例如图片和div中的width, height等. 不过采集到的html中,样式的写法各有不同,例如大小写,中间有空格等. 因此使用php正则编写了下面这个方法,对这些奇葩的样式进行过滤. 代码如下: <?php /** * 清除宽高样式 * @param String $content 内容 * @retu
随机推荐
- python 文件操作删除某行的实例
- 详解springboot 使用c3p0数据库连接池的方法
- Django 添加静态文件的两种实现方法(必看篇)
- 基于Django模板中的数字自增(详解)
- 第十篇BootStrap轮播插件使用详解
- VBS教程:函数-WeekDayName 函数
- 始终在页面底部的层js实现代码
- C#实现DevExpress本地化实例详解
- 浅谈shiro的SecurityManager类结构
- PHP 5 数据对象 (PDO) 抽象层与 Oracle
- 基于动态修改App.Config与web.Config的使用详解
- C语言中交换int型变量的值及转换为字符数组的方法
- C++ 中继承与动态内存分配的详解
- jQuery 使用手册(一)
- 详解如何使用Python编写vim插件
- 浅谈用VSCode写python的正确姿势
- python Pandas 读取txt表格的实例
- java使用Dijkstra算法实现单源最短路径
- Python数据类型之String字符串实例详解
- python多进程读图提取特征存npy