深入理解JS正则表达式之test方法及其陷阱
test方法
test方法介绍
RegExp.prototype.test(str)
test方法用于测试字符串参数中是否存在匹配正则表达式模式的字符串
test方法的使用
let reg = /\w/ reg.test('a') // true reg.test('$') // false
通过结果可以看出,如果测试字符串参数存在匹配正则表达式模式的字符串则返回true,否则返回false
test方法的那些坑
当正则表达式使用了全局匹配时,test方法会出现如下的这种奇怪现象:
let reg = /\w/g reg.test('ab') // true reg.test('ab') // true reg.test('ab') // false reg.test('ab') // true
可以看到,每轮的第三次匹配返回会变为true,但是,ab
不是都符合reg吗,返回都应该返回true才对。原因就在于上一节提到过的lastIndex属性。
我们可以试试每次都运行test方法都打出reg的lastIndex方法:
let reg = /\w/g reg.lastIndex // 0 reg.test('ab') // true reg.lastIndex // 1 reg.test('ab') // true reg.lastIndex // 2 reg.test('ab') // false reg.lastIndex // 0 reg.test('ab') // true reg.lastIndex // 1
看看结果,然后回忆下lastIndex的定义,你就明白原因了。
lastIndex属性是当前表达式匹配内容的最后一个字符的后一位,用于规定下一次匹配的起始位置。
当进入正则表达式全局模式时,每次使用test方法都会从lastIndex开始,匹配从lastIndex开始的子字符串。比如例子中,第二次执行test方法时,此时,lastIndex已经变为2,子字符串为空,所以reg不可能匹配上它。由于子字符串匹配失败,test方法返回false,并将lastIndex属性置为0,重新开始一轮循环。
避免test中的坑的方法
第一种方法:test方法本身就是用来测试是否存在匹配正则的字符串,不使用全局模式一样可以实现目的,所以第一种方法就是不适用全局模式。
第二种方法:不将正则对象实例存在变量中,每次直接用正则对象实例调用test方法,不过这种方法对内存有所损耗,理论上不建议。
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
以上就是深入理解JS正则表达式之test方法及其陷阱的详细内容,更多请关注其它相关文章!
上一篇: php中result是什么意思
下一篇: composer 不能只更新某个文件吗?