JavaScript 正则表达式匹配以数字结尾的字符串不一致

4

我有以下正则表达式模式,可以匹配URL列表中以数字结尾的所有'act'

正则表达式模式:/\/ch(\d+)\/act(\d+)/gi

Javascript代码:

pageSrc[1] = "../ch01/index.html";
pageSrc[2] = "../ch01/act01/1.html";
pageSrc[3] = "../ch01/act01/2.html";
pageSrc[4] = "../ch01/act02/1.html";
pageSrc[5] = "../ch01/act02/2.html";
pageSrc[6] = "../ch01/actx/1.html";

var pattern = /\/ch(\d+)\/act(\d+)/gi;
for(var i=0; i<pageSrc.length; ++i){
  var hasAct = pattern.test(pageSrc[i]);
  console.log(hasAct);
}

预期结果和实际结果

|   String   | Expected Result |   Actual Result  |
| pageSrc[1] |       false     |     false        |
| pageSrc[2] |       true      |     true         |
| pageSrc[3] |       true      |     *FALSE       |
| pageSrc[4] |       true      |     true         |
| pageSrc[5] |       true      |     *FALSE       |
| pageSrc[6] |       false     |     false        |

我不确定为什么pageSrc[3]无法返回true。 我在gskinner.com上使用了正则表达式测试工具,它可以正常运行,这是链接 http://gskinner.com/RegExr/?344ap

有人能帮我看一下吗?谢谢!

2个回答

3

您正在使用/g标志。请移除该标志以使它正常工作。

g标志会导致正则表达式从pattern.lastIndex开始匹配(上次匹配结束的索引),然后一直匹配,直到失败,然后从0开始重新匹配。


谢谢回复,你的解决方案和Matt的一样有效。由于我不能标记两个答案,我已经点赞了你的:) 再次感谢! - James Wong

3

移除g标志。根据RegExp.test文档:

exec(或与其组合使用)类似,对同一全局正则表达式实例多次调用test将超过前一个匹配。

当重复使用此模式时,您不希望进行全局搜索。

> var pageSrc = [];
> pageSrc[1] = "../ch01/index.html";
  pageSrc[2] = "../ch01/act01/1.html";
  pageSrc[3] = "../ch01/act01/2.html";
  pageSrc[4] = "../ch01/act02/1.html";
  pageSrc[5] = "../ch01/act02/2.html";
  pageSrc[6] = "../ch01/actx/1.html";

  var pattern = /\/ch(\d+)\/act(\d+)/i;
  for(var i=0; i<pageSrc.length; ++i){
    var hasAct = pattern.test(pageSrc[i]);
    console.log(i, hasAct);
  }
  0 false
  1 false
  2 true
  3 true
  4 true
  5 true
  6 false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接