2012-07-17 40 views
0

我想要得到的第二個「.AT」「指數‘的貓,蝙蝠,坐,脂肪’,該計劃是:javaScript的正則表達式的第二個索引

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,請嗎?

-_-

回答

2

你的問題是因爲你使用相同的正則表達式都.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/

+0

謝謝。我現在知道了。你的代碼非常清晰。 – codesve 2012-07-19 01:25:30

1

當重複調用,在全球正則表達式模式exectest時,下一次搜索的起始位置存儲在正則表達式對象lastIndex屬性中。每次致電testexec都會提前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 
} 

所以是的,使用測試和EXEC在代碼中擺脫下一個搜索的起始索引。

+0

感謝您的分析,非常有幫助! – codesve 2012-07-19 01:27:53

相關問題