android 正则判断乱码,浅谈 js 正则之 test 方法 – 乱码.

7bac5154b3cbcc9f49df88f24dbb0b58.gif其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西。

先来看个东西吧。

var re = /d/;

console.log( re.test(“1”) );

console.log( re.test(“1”) );

console.log( re.test(“1”) );

console.log( re.test(“1”) );

全部是 true 没问题。。

c5726daf590431ecf4bfa33669641dea.png

但是你把 /d/; 改成 /d/g; 再试试。

012527ea488017a6d2b4508fdc709d22.png

再次修改:

console.log( /d/g.test(“1”) );

console.log( /d/g.test(“1”) );

console.log( /d/g.test(“1”) );

console.log( /d/g.test(“1”) );

afdc4d68dbad4f8887aa6eae14a268e0.png

全部是 true,这究竟是为什么呢?

这些结果相当有意思,当然高手自然知道为什么,如果你知道的话,下面其实可以跳过不用看了,全是水文而已。。

正则里有一个 lastIndex 的属性,是下一次匹配的开始位置。

var re = /d/g;

console.log( re.test(“1”), re.lastIndex );

console.log( re.test(“1”), re.lastIndex );

console.log( re.test(“1”), re.lastIndex );

console.log( re.test(“1”), re.lastIndex );

31d8968faa797ee8c145bfb65e4360f3.png

可以看到 第一次匹配结果为 true 表示匹配成功,此时 lastIndex 记录下一次匹配的起始位置为 1。

于是第二次匹配的时候 从 “1” 字符串索引 1 的位置匹配,当然就匹配失败了,因为这个字符串只有一个字符,他的索引是 0。

而 /d/g.test(“1”) 这个为什么每次匹配成功能呢?

因为它直接用正则字面量,相当于每次重新创建一个正则对象,lastIndex 属性是初始值 0。

所以每次都能匹配成功。

现在是不是理解了,包括 exec 也一样,每次匹配一个,lastIndex 记录下次匹配的起始位置。

如果非要用一个正则对象的,那就只有每次 test 前重置 lastIndex 了,这样才能保证他不出以外。

var re = /d/g;

console.log( re.test(“1”) );

re.lastIndex = 0;

console.log( re.test(“1”) );

re.lastIndex = 0;

console.log( re.test(“1”) );

re.lastIndex = 0;

console.log( re.test(“1”) );

c193b0447262c54f6b4dbb30cc08452e.png

好了,今天修改语法高亮插件花了不少时间,所以水了一篇,望大家海涵。。

18ec05e9087b37bd915338ca8da034ff.png

c0b23af6186a049feaa7c1b4139b7f29.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值