为什么反转全局正则表达式始终在JavaScript中返回true

时间:2014-04-28 14:49:11

标签: javascript regex

示例代码

这与宣传的一样:

var re = /abc/;
re.test("abc");
//true
!re.test("abc");
//false;

这不是:

var re2 = /abc/g;
//undefined
re2.test("abc");
//true
!re2.test("abc");
//true

是什么给出了?

我已经使用多个正则表达式对其进行了测试,似乎/g标志使所有!都返回true。

如果有帮助,我正在使用Chrome 34。

2 个答案:

答案 0 :(得分:3)

来自MDN page on .test()

  

每当您想知道是否在a中找到模式时,请使用test()   string(类似于String.search方法);欲获得更多信息   (但执行速度较慢)使用exec方法(类似于   String.match方法)。与exec(或与其结合)一样,测试   在同一个全局正则表达式实例上多次调用   将超过上一场比赛。

因此,使用g标志将在每次连续调用时通过字符串移动.test()超过它找到的每个匹配(与.exec()相同的行为)。

它通过修改名为lastIndex的正则表达式本身的属性来完成此操作,该属性告诉下一个.test()操作,它应该在下次使用正则表达式时使用字符串开始搜索(使用某些方法) 。 g标志告诉正则表达式使用.lastIndex属性。没有该标志,则不使用该属性。该属性可以手动设置回0,但如果您只删除g标记,那么您不必担心它。

除非您明确尝试使用此功能,否则您可能不希望将g标记与.test()一起使用。

答案 1 :(得分:1)

第一次调用re2.test()时,会将名为lastIndex的指针索引属性移动到re2对象的模式字符串的末尾。第二次调用它时,它将返回false,因为它找不到任何匹配的" abc"在" c"之后模式字符串的字符

每次调用.test()后,您都可以按re2.lastIndex = 0重置它。因此,第二次调用.test()时,它将从第一个索引

进行搜索

此属性仅适用于" g"修饰符已设置。