javascript 使用正则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

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

(0)

相关推荐

  • javascript中return,return true,return false三者的用法及区别

    1.语法及返回方式 ①返回控制与函数结果 语法为:return 表达式; 语句结果函数的执行,返回调用函数,而且把表达式的值作为函数结果返回出去 ②返回控制无函数结果 语法为:return; 在大多数情况下,为事件处理函数如果让其返回false,可以防止默认的事件行为.例如,默认情况下,点击一个<a>标签元素,页面会跳转到该元素href属性指定的页. 而return false就相当于终止符,return true就相当于执行符. 在js中return false的作用一般是用来取消默认动作的

  • JS中的==运算: [''] == false —>true

    计算下面表达式的值: [''] == false 首先,两个操作数分别是对象类型.布尔类型.根据图1,需要将布尔类型转为数字类型,而false转为数字的结果是0,所以表达式变为: [''] == 0 两个操作数变成了对象类型.数字类型.根据图1,需要将对象类型转为原始类型: 首先调用[].valueOf(),由于数组的valueOf()方法返回自身,所以结果不是原始类型,继续调用[].toString(). 对于数组来说,toString()方法的算法,是将每个元素都转为字符串类型,然后用逗号'

  • JavaScript中为什么null==0为false而null大于=0为true(个人研究)

    生活中我们在不停的编写代码,写着JavaScript,很少有时间进行概念上的研究.我呢,今天闲来没啥事,研究了一下有关"null"和"0"的关系.希望大家看完了能有所收获. 复制代码 代码如下: alert(null>=0) 复制代码 代码如下: 上面的代码会弹出什么来呢?False?True?其实是true.那么是为什么呢?为什么"null>=0"为true呢?null>=0的时候,强转为数字类型.在进行null>=0比

  • 老生常谈js中0到底是 true 还是 false

    想到一个好玩的,运行如下 javascript : if ('0') alert("'0' is true"); if ('0' == false) alert("'0' is false"); 结果是,两次都 alert 了!那么 '0' 到底是 true 还是 false 呢? 答案是:在js做比较的时候,有这样的三条规则: • 如果比较的两者中有bool,会把 bool 先转换为对应的 number,即 0 和 1 • 如果比较的双方中有一方为number一方

  • js中各种类型的变量在if条件中是true还是false

    js的弱类型让人感觉很多东西都比较迷惑,例如变量在if条件中到底是true还是false,如果在强类型语言中将一个非boolean类型的变量放在if条件中时,是需要进行类型转换的,但是js不需要,下面来进行测试,测试常见的变量类型在if条件中的表现 !function test1(){ <span style="color:#ff0000;">var a,b=-1,c= 1,d= 0,e=null,f=undefined,g='',h="";</s

  • javascript 使用正则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.

  • 总结JavaScript的正则与其他语言的不同之处

    前言 最近发现JavaScript中的正则在某些地方的表现和其他语言或工具中的正则有些不同,比较另类.虽然你几乎不可能写出也几乎用不到下面我讲的这些正则,但是了解一下毕竟是好的. 本文中的代码示例都是在兼容ES5的JavaScript环境中执行的,也就是说,IE9之前版本,Fx4左右的版本,等,中的表现很有可能和我下面讲的不一样. 1.空字符类 不包含任何字符的字符类[]称之为空字符类(empty char class),我相信你没听别人这么叫过,因为在其他语言中,这种写法是非法的,所有的文档和

  • javascript的正则匹配方法学习

    javascript中正则匹配有3个方法,match,exec,test.这些方法都跟字符串和RegExp对象有关,但使用场景不一样,容易混淆.match是字符串的一个方法,接收一个RegExp对象做为参数,其他的是RegExp对象的方法,接收一个字符串参数. var str = 'abcdef12ab34cd56ef'; var patt = new RegExp('ab'); //主意是非全局匹配 var ret_test = patt.test(str); console.log(ret_

  • JavaScript的正则也有单行模式了

    正则表达式最早是由 Ken Thompson 于 1970 年在他改进过的 QED 编辑器里实现的,正则里最简单的元字符 "." 在当时所匹配的就是除换行符外的任意字符: "." is a regular expression which matches any character except <nl>. 上面这句话出自 QED 在 1970 年的官方文档,这可能是史上第一份正则文档. 为什么要这么规定?是因为 QED 是以行为单位来编辑文件的,而且行

  • JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】

    本文实例总结了JavaScript常用正则验证函数.分享给大家供大家参考,具体如下: 1.验证年龄格式(年龄只能0~99,两位数) //验证年龄格式(年龄只能0~99,两位数) function ValidateUserAge(age) { var regNum = /^[0-9]{1,2}$/; if (regNum.test(age)) { return true; } else { alert("请输入正确的年龄!") return false; } } 2.控制文本框只能输入数

  • Javascript使用正则验证身份证号(简单)

    身份证为15位或者18位,15位的全为数字,18位的前17位为数字,最后一位为数字或者大写字母"X". 与之匹配的正则表达式: (^\d{15}$)|(^\d{17}([0-9]|X)$) 下面以Javascript为例进行说明: functionisIdCardNo(num) { num = num.toUpperCase(); //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X. if ( !(/(^\d{15}$)|(^

  • javascript使用正则实现去掉字符串前面的所有0

    字符串是这个样子,0000202或者00000840,要对字符串前面的0在显示时去掉,只显示202,840.正则实现如下: var str="00000802"; var reg = new RegExp("([0]*)([1-9]+[0-9]+)", "g"); console.info(str.replace(reg, "$2")); 总结 以上所述是小编给大家介绍的javascript使用正则实现去掉字符串前面的所有0,

  • JavaScript实现正则去除a标签并保留内容的方法【测试可用】

    本文实例讲述了JavaScript实现正则去除a标签并保留内容的方法.分享给大家供大家参考,具体如下: 一.问题: 有如下HTML代码,要求用正则去除a标签,只留下内容 //www.jb51.net 复制代码 代码如下: <a href="//www.jb51.net/" style="box-sizing: border-box; color: rgb(51, 51, 51); text-decoration: none; transition: all 0.5s c

  • javascript下正则匹配百分比的代码

    <script language="javascript">     var re = /^-?\d+%$/;     alert(re.test('50%'));     alert(re.test('-25%'));     alert(re.test('3a5%')); </script>

  • javascript使用正则控制input输入框允许输入的值方法大全

    1.只允许输入数字 <input name="username" type="text" onkeyup="value=this.value.replace(/\D+/g,'')"> 2.只允许输入英文字母.数字和下划线(以下二种方法实现) <input name="username" type="text" style="ime-mode:disabled">

随机推荐