吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2484|回复: 4
收起左侧

[其他转载] JS正则RegExp.test(),第一次true,第二次false

[复制链接]
luckily 发表于 2022-3-13 13:35
RegExp.test()异常分析

## 现象

代码如下:
[JavaScript] 纯文本查看 复制代码
const reg= /^[0-9]+$/g;
reg.test('123abcdef');
// true
reg.test('123abcdef');
// false


如上的代码,第一次测试返回true,第二次以及之后的调用都会返回false。

## 原因

这是因为RegExp.test()方法,第一次从位置0开始查找,可以匹配;第二次的查找位置就不是0了,说以就不能匹配了(加上了【g】修饰符才会有这个问题,第二次会从第一次匹配的位置后面开始查找,即lastIndex 属性规定的下次匹配的起始位置)。

## 解决方法:

方案1

去掉正则修饰符 g ,如下:
[JavaScript] 纯文本查看 复制代码
const reg= /^[0-9]+$/;
reg.test('123abcdef');
// true
reg.test('123abcdef');
// false


方案2
不要复用RegExp,每次测试前都使用新的RegExp对象。上述代码改为:
[JavaScript] 纯文本查看 复制代码
const getReg = () => {
  const reg= /^[0-9]+$/g;
  return reg;
}
getReg().test('123abcdef');
// true
getReg().test('123abcdef');
// true


方案3
很多时候,我们必须要执行 全局匹配( g ),这时候就不能使用第一种方案了。
其实,我们的lastIndex 属性是可读可写的。
只要目标字符串的下一次搜索开始,就可以对它进行设置。
[JavaScript] 纯文本查看 复制代码
const reg= /^[0-9]+$/g;
reg.test('123abcdef');
// true
reg.lastIndex = 0;
reg.test('123abcdef');
// true

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

不苦小和尚 发表于 2022-3-13 16:09
不错不错小技巧
leven5 发表于 2022-3-13 17:02
你都^\d$了任何时候都不可能是true,别乱发东西了
晴灬天 发表于 2022-3-13 17:02
/^[0-9]+$/g;

你这是有匹配边界吧,我看这个返回的也是false呢,是数字开头结尾的,可以匹配多个。结果应该都为false。
unmask 发表于 2022-3-13 18:27
你都明显的加边界了,字符abcdef怎么可能满足你的正则呢?
你把边界符号^$去掉,再试试是不是你想要的。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 10:11

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表