javascript 使用正则test( )第一次是 true,第二次是false

 更新时间:2017年02月22日 08:46:29   投稿:lqh  
这篇文章主要介绍了使用正则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

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

  1. match(regexp) : 找到一个或多个正则表达式的匹配
  2. replace(regexp) : 替换与正则表达式匹配的子串
  3. search(regexp) : 检索与正则表达式相匹配的值
  4. 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

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • 关于Javascript中document.cookie的使用

    关于Javascript中document.cookie的使用

    这篇文章主要介绍了关于Javascript中document.cookie的使用,通过cookie来记住密码保存密码功能,需要的朋友可以参考下
    2017-03-03
  • JS+CSS实现电子商务网站导航模板效果代码

    JS+CSS实现电子商务网站导航模板效果代码

    这篇文章主要介绍了JS+CSS实现电子商务网站导航模板效果代码,涉及JavaScript结合css动态操作页面元素属性的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-09-09
  • 浅述Javascript的外部对象

    浅述Javascript的外部对象

    本文主要对Javascript的外部对象进行介绍,列举了具体实例。便于理解。有需要的朋友可以看下
    2016-12-12
  • Echarts自定义地图和添加图标代码示例

    Echarts自定义地图和添加图标代码示例

    这篇文章主要给大家介绍了关于Echarts自定义地图和添加图标的相关资料,项目中经常会遇到需要渲染echarts地图的情况,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • Uniapp 实现全民分销功能原理解析

    Uniapp 实现全民分销功能原理解析

    这篇文章主要介绍了Uniapp 实现全民分销功能,本篇文章主要介绍全民分销功能实现原理,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 开发跨浏览器的JavaScript方法说明

    开发跨浏览器的JavaScript方法说明

    IE是当前浏览器的一个异类,不过解决方法倒也相当简单,使用Firefox和Safari 之 类的浏览时,可以使用元素的setArribute方法来设置元素的class属性
    2008-08-08
  • 如何更好的编写js async函数

    如何更好的编写js async函数

    本文给大家谈一下如何优化async代码,更充分的利用异步事件流杜绝滥用async,感兴趣的朋友跟随脚本之家小编一起学习吧
    2018-05-05
  • 微信小程序抽奖组件的使用步骤

    微信小程序抽奖组件的使用步骤

    这篇文章主要给大家介绍了关于微信小程序抽奖组件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例

    微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例

    本篇文章主要介绍了微信小程序-图片、录音、音频播放、音乐播放、视屏、文件代码实例,有兴趣的可以了解一下。
    2016-11-11
  • JS 面向对象之神奇的prototype

    JS 面向对象之神奇的prototype

    对于初学 JavaScript 的人来说 prototype 是一种很神奇的特性,而事实上,prototype 对于 JavaScript 的意义重大,prototype 不仅仅是一种管理对象继承的机制,更是一种出色的设计思想。
    2011-02-02

最新评论