一个JS数组有两个值相同的元素,用正则test()方法测试出来却是一个true,一个false?

代码如下:

var arr = ["aab", "aab"];
var p = /(.)(?:\1+)/g;

p.test("aab");//true

p.test(arr[0]);//false
p.test(arr[1]);//true

再次进行测试:

p.test(arr[0]);//false
p.test(arr[1]);//true
p.test(arr[0]);//false
p.test(arr[1]);//true

发现是true false交替下去的

随机换了组数据测试:


var arr1 = ["a", "a"];
var p1 = /\w/g;

p1.test("a");//true

p1.test(arr[0]);//true
p1.test(arr[1]);//true

应该是我关于js数组或者正则表达式有什么地方的特性没有了解到。还望解答: )

阅读 3.7k
2 个回答

给你个这个东东看看,直接截图,不打字,不墨迹

clipboard.png

此处你的代码使用了同一个RegExp实例,自然第一次会是true,但是第二次test时,是从第2个字符开始检测,类似于
/(.)(?:\1+)/g.test('b')自然得到false

在创建正则表达式对象时如果使用了“g”标识符或者设置它了的global属性值为ture时,那么新创建的正则表达式对象将使用模式对要将要匹配的字
符串进行全局匹配。在全局匹配模式下可以对指定要查找的字符串执行多次匹配。每次匹配使用当前正则对象的lastIndex属性的值作为在目标字符串中开
始查找的起始位置。lastIndex属性的初始值为0,找到匹配的项后lastIndex的值被重置为匹配内容的下一个字符在字符串中的位置索引,用来
标识下次执行匹配时开始查找的位置。如果找不到匹配的项lastIndex的值会被设置为0。当没有设置正则对象的全局匹配标志时lastIndex属性的值始终为0,每次执行匹配仅查找字符串中第一个匹配的项。可以通下面的代码来查看在执行匹配相应的lastIndex
属性的值。

var arr = ["aab", "aab"];
var p = /(.)(?:\1+)/g;

p.test("aab");//true
console.log(p.lastIndex) //2 即匹配时从字符串索引2的位置开始匹配。
p.test(arr[0]);//false  
console.log(p.lastIndex) //0
p.test(arr[1]);//true   
console.log(p.lastIndex) //2
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题