我有以下正则表达式模式,匹配所有'act',以URL列表中的数字结尾。
正则表达式/\/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上使用了regEx测试器,它运行正常,这里是链接http://gskinner.com/RegExr/?344ap
任何人都可以帮我看一下吗?提前谢谢!
答案 0 :(得分:3)
您正在使用/g
。删除该标志以使其正常工作。
g
标志使正则表达式从pattern.lastIndex
(前一个匹配结束的索引)开始匹配,直到失败,然后从0开始。
答案 1 :(得分:3)
删除g
标志。来自the RegExp.test
documentation:
与
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