问题
最近遇到一个奇怪的问题,同样的正则匹配,返回的值却不一样:
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

希望可以给你点思路。