为什么正则表达式对象在" for"之外被分配时不起作用?循环?JavaScript的

时间:2018-01-29 15:45:17

标签: javascript regex

它不起作用:

function test(str) {
   var vowelsCount = 0;
   var arr = str.split('');
   var regex = new RegExp(/[aeiou]/, 'gi');
   arr.forEach((item, index, array) =>{
      if(regex.test(item)){
         vowelsCount++;
      }
   });
   return vowelsCount;
}
test('pear tree');   //2,it passes a and the second e

它的工作原理是:

arr.forEach((item, index, array) =>{
   var regex = new RegExp(/[aeiou]/, 'gi');
   if(regex.test(item)){
      vowelsCount++;
   }
});

当正则表达式对象在循环外部分配时,为什么不正确?

1 个答案:

答案 0 :(得分:2)

因为您使用g标志。删除全局标志,它将工作。原因是当您在g变量中使用regex标记时,您有lastIndex字段。在不同的数组字符串上使用regex时,此索引包含不正确的值。在第二个示例中,因为您在每次迭代中定义了新的regex,并且lastIndex字段每次都设置为0。您也可以手动重置该索引。

function test(str) {
   var vowelsCount = 0;
   var arr = str.split('');
   var regex = new RegExp(/[aeiou]/, 'gi');
   arr.forEach((item, index, array) =>{
      if(regex.test(item)){
         vowelsCount++;
      }
      regex.lastIndex = 0
   });
   return vowelsCount;
}
test('pear tree');