修复相同正则RegExp使用exec或者test交替返回true和false

当使用全局搜索修饰符g时,正则表达式的exec和test方法会在lastIndex处开始新匹配。这导致连续调用可能返回交替的true和false。解决方法是在每次调用后重置lastIndex为0,确保正确返回匹配结果。
摘要由CSDN通过智能技术生成

问题

新写一个正则,比如/^[A-Za-z]+[A-Za-z0-9\_]*$/g,在调用exec和test方法时交替返回true和false,乍一看还以为正则出了什么问题。

const reg = /^[A-Za-z]+[A-Za-z0-9\_]*$/g;
const str = 'a_1';

reg.test(str);
//	返回 true

reg.test(str);
// 返回 false

思路

  1. 先了解下exectest方法
方法描述
exec一个在字符串中执行查找匹配的RegExp方法,它返回一个数组(未匹配到则返回null)。
test一个在字符串中测试是否匹配的RegExp方法,它返回true或false。
  1. 了解下修饰符glastIndex

修饰符

标志描述
g全局搜索。

属性

属性或索引描述
lastIndex下一个匹配的索引值。(这个属性只有在使用g参数时可用)

重点

lastIndex 属性用于规定下次匹配的起始位置。

注意: 该属性只有设置标志 g 才能使用。 上次匹配的结果是由方法 RegExp.exec() 和 RegExp.test() 找到的,它们都以 lastIndex 属性所指的位置作为下次检索的起始点。这样,就可以通过反复调用这两个方法来遍历一个字符串中的所有匹配文本。

注意:该属性是可读可写的。 只要目标字符串的下一次搜索开始,就可以对它进行设置。当方法 exec() 或 test() 再也找不到可以匹配的文本时,它们会自动把 lastIndex 属性重置为 0。

解决方案

exectest使用正则带有修饰符g时,每一次执行都会把 lastIndex 属性所指的位置作为下次检索的起始点,那么我们执行时手动重置该属性位置即可正常返回查询boolean值。

const reg = /^[A-Za-z]+[A-Za-z0-9\_]*$/g;

function test(reg, str) {
	const result = reg.test(str);
	reg.lastIndex = 0;	//	重置该位置
	return result;
}

test(reg, 's_1');
//	true

test(reg, 's_1');
//	true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值