多次调用正则test()方法,但返回值不同

680 阅读1分钟

问题

最近遇到一个奇怪的问题,同样的正则匹配,返回的值却不一样:

let reg = /^[\sa-zA-Z0-9\u4e00-\u9fa5~!@#$%^&*()_+`\-={}|:"<>?[\];',./~!@#¥%…&*()—+·\-={}|:“”《》?【】、;‘’,。/]*[\sa-zA-Z0-9\u4e00-\u9fa5~!@#$%^&*()_+`\-={}|:"<>?[\];',./~!@#¥%…&*()—+·\-={}|:“”《》?【】、;‘’,。/]$/gim;

reg.test('1')
//true

reg.test('1')
//false

reg.test('1')
//true

reg.test('1')
//false

四次同样的输入但是却四次不一样的输出:

原因:

因为正则reg的全局属性,设置的全局匹配。RegExp有一个lastIndex属性,来保存索引开始位置,两次开始的起始值不同,也导致两次结果不一样。

问题解决:

一:是将全局属性去掉,默认不会全局匹配。

二:在每次匹配之前将lastIndex的值设置为0,从头开始匹配

reg.test('1')
true
reg.lastIndex = 0;
0
reg.test('1')
true

希望可以给你点思路。