时间:2021-05-02
其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西
下面的代码都是在chrome的f12下调试的,大家可以研究一下
先来看个东西吧。
? 1 2 3 4 5 var re = /\d/; console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1") );全部是 true 没问题。。
但是你把 /\d/; 改成 /\d/g; 再试试。
再次修改:
? 1 2 3 4 console.log( /\d/g.test("1") ); console.log( /\d/g.test("1") ); console.log( /\d/g.test("1") ); console.log( /\d/g.test("1") );全部是 true,这究竟是为什么呢?
这些结果相当有意思,当然高手自然知道为什么,如果你知道的话,下面其实可以跳过不用看了,全是水文而已。。
正则里有一个 lastindex 的属性,是下一次匹配的开始位置。
? 1 2 3 4 5 var re = /\d/g; console.log( re.test("1"), re.lastindex ); console.log( re.test("1"), re.lastindex ); console.log( re.test("1"), re.lastindex ); console.log( re.test("1"), re.lastindex ); 可以看到 第一次匹配结果为 true 表示匹配成功,此时 lastindex 记录下一次匹配的起始位置为 1。
于是第二次匹配的时候 从 "1" 字符串索引 1 的位置匹配,当然就匹配失败了,因为这个字符串只有一个字符,他的索引是 0。
而 /\d/g.test("1") 这个为什么每次匹配成功能呢?
因为它直接用正则字面量,相当于每次重新创建一个正则对象,lastindex 属性的初始值是 0。
所以每次都能匹配成功。
现在是不是理解了,包括 exec 也一样,每次匹配一个,lastindex 记录下次匹配的起始位置。
如果非要用一个正则对象的,那就只有每次 test 前重置 lastindex 了,这样才能保证他不出意外。
好了,今天修改语法高亮插件花了不少时间,所以水了一篇,望大家海涵。。
原文链接:https://www.cnblogs.com/52cik/p/js-regexp-test.html
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前几天谈了正则匹配js字符串的问题:《js正则学习小记之匹配字符串》和《js正则学习小记之匹配字符串优化篇》。里面讲到了优化正则起到提升性能的问题,但是能提升多
本文实例讲述了js正则表达式test()和exec()用法。分享给大家供大家参考。具体如下:复制代码代码如下://正则.test(内容),返回true或fals
浅谈js图片前端预览之filereader和window.URL.createObjectURL//previewimg:filereader方式documen
varreg=/正则表达式/;booleanreg.test(要验证的字符串);js引擎会将/正则表达式/“”转换成一个RegExp对象
js正则表达式中test,exec,match方法的区别说明testtest返回Boolean,查找对应的字符串中是否存在模式。varstr="1a1b1c";