带有g修饰符的正则表达式test方法为何交替返回真假?
为啥正则test方法会交替返回true/false?
哈哈,这个坑我刚接触正则的时候也踩过,当时盯着控制台输出愣了半天!问题出在你正则表达式里的g标志上。
带g(全局匹配)标志的正则表达式,会自带一个lastIndex属性——这个属性专门记录下一次匹配开始的位置。每次调用test()方法后,它都会更新这个值:如果找到了匹配项,lastIndex就会跳到匹配结果的下一个字符位置;如果没找到,就会把lastIndex重置为0。
咱们结合你的代码一步步拆解:
- 第一次调用
rexPassword.test('Password1!'):从索引0开始找大写字母,匹配到了开头的P,返回true,同时lastIndex被设为1。 - 第二次调用:从索引1开始检查剩下的字符串
assword1!,这里面没有大写字母,所以返回false,同时lastIndex重置为0。 - 第三次调用:又从索引0开始,再次匹配到
P,返回true,lastIndex又变成1。
如此循环往复,就出现了true false true的交替结果。
解决办法有两种:
- 去掉
g标志:你的需求只是检查字符串中是否存在大写字母,不需要全局匹配所有大写字母,所以g完全是多余的:var rexPassword = /[A-Z]/; console.log(rexPassword.test('Password1!')); // true console.log(rexPassword.test('Password1!')); // true console.log(rexPassword.test('Password1!')); // true - 每次调用前重置
lastIndex:如果你确实需要保留g标志(比如其他场景要用全局匹配),那每次调用test()前手动把lastIndex设为0就行:var rexPassword = /[A-Z]/g; rexPassword.lastIndex = 0; console.log(rexPassword.test('Password1!')); // true rexPassword.lastIndex = 0; console.log(rexPassword.test('Password1!')); // true rexPassword.lastIndex = 0; console.log(rexPassword.test('Password1!')); // true
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

