javaScript RegExp第二个索引
javaScript RegExp the second index
我想在"cat,bat,sat,fat"中获得第二个".at"索引,程序是:
var text = "cat, bat, sat, fat";
var pattern = /.at/g;
var matches = pattern.exec(text);
var num = 2;
var i = 0;
while(pattern.test(text)){
if(++i == num){
alert(matches.index);
break;
}
matches = pattern.exec(text);
}
正确的指数应该是5,但为什么我得到10呢?
-_-
您的问题是,您对.test()
和.exec()
使用了相同的正则表达式,并希望状态不会受到影响,但lastIndex
是由.test()
高级的,因此在下一个.exec()
发生时不正确。为了消除这个问题,你可以删除.test()
,然后它就可以工作了(而且效率更高):
var text = "cat, bat, sat, fat";
var pattern = /.at/g;
var num = 2, i = 0, matches;
while(matches = pattern.exec(text)){
if(++i == num){
alert(matches.index);
break;
}
}
在此处进行演示:http://jsfiddle.net/jfriend00/rbWQj/
在全局正则表达式模式上重复调用exec
或test
时,下一次搜索的起始位置存储在正则表达式对象lastIndex
属性中。对test
或exec
的每次调用都会推进lastIndex
属性。考虑到这一点,让我们看看您的代码在做什么:
var text = "cat, bat, sat, fat";
var pattern = /.at/g;
var matches = pattern.exec(text); //goes over the first match at 0, lastIndex=3
var num = 2;
var i = 0;
while(pattern.test(text)){
//first iteration: lastIndex=8 not 3, match at 5
//second iteration: lastIndex=18, match at 15
if(++i == num){
//matches still has the match from 10
alert(matches.index); //returns 10
break;
}
matches = pattern.exec(text);
//first iteration: lastIndex=13, match at 10
}
所以,是的,在代码中同时使用test和exec会打乱下一次搜索的起始索引。
相关文章:
- 下拉选择可自动更改第二个下拉选择
- 为什么不'在JQuery中找到第二个css选择器的工作
- 当单击第一个李时,它显示内容一,当单击第二个李时,它显示内容二
- CORS-重定向到第二个GET正在接收的页面
- 正则表达式与数字中的第二个点匹配
- 如何在react js中移动第二个组件
- 使用Javascript,如何显示<tr>在另一<tr>悬停时,隐藏第二个<tr>
- 关闭第二个事件源上的第一个事件源's onopen方法
- D3从嵌套的JSON中绘制第二个圆环图
- IE11中的第二个调用取消了第一个Fetch API调用
- 第一个字第一个字符第二个字第二个字符,一直到数组结束
- 角度指令:指向第二个元素
- 时间选择器:如何通过更改第一个值来更改第二个值
- 我如何从字符串中选出第一个单词的第一个字母,然后再选出第二个单词
- javaScript RegExp第二个索引
- 将两个数组中的项目合并到第三个数组中,其中一列从第一个数组中减去第二个索引
- 如何从数组中获取第二个索引请求,以便从jQuery开始
- 推送到数组只读取Javascript中的第二个索引
- 按第一个列表中项目的索引将项目添加到第二个列表中
- JavaScript神秘地跳过了数组的第二个索引