2013-01-10 105 views
0

我試圖獲得我在文檔中找到的每個模式的索引。到目前爲止,我有:匹配器查找第n個匹配索引

String temp = "This is a test to see HelloWorld in a test that sees HelloWorld in a test"; 
    Pattern pattern = Pattern.compile("HelloWorld"); 
    Matcher matcher = pattern.matcher(temp); 
    int current = 0; 
    int start; 
    int end; 

    while (matcher.find()) { 
     start = matcher.start(current); 
     end = matcher.end(current); 
     System.out.println(temp.substring(start, end)); 
     current++; 
    } 

出於某種原因它一直在尋找的tempHelloWorld一審雖然這會導致一個無限循環。說實話,我不確定你是否可以使用matcher.start(current)matcher.end(current) - 這只是一個瘋狂的猜測,因爲matcher.group(current)以前工作。這次我需要實際的索引,儘管matcher.group()不適合我。

回答

2

修改正則表達式是這樣的:

while (matcher.find()) { 
    start = matcher.start(); 
    end = matcher.end(); 
    System.out.println(temp.substring(start, end)); 
} 
+0

我明白了。我瀏覽了我的代碼。我不使用'current'。 –

1

問題是這樣的一行代碼。

start = matcher.start(current); 

current在第一次迭代後爲1。

2

不要將索引傳遞給start(int)end(int)。 API聲明參數是組號。在你的情況下,只有零是正確的。改爲使用start()end()

匹配器將移動到下一場比賽在每次迭代,因爲你的電話到find()

這種方法開始在輸入序列的開始,或者,如果該方法的前一次調用是成功的,匹配器還沒有被重置,第一個字符與之前的匹配不匹配。

1

如果你只需要你的匹配文本的開始和結束偏移,則不需要當前組,這將是確定:

String temp = "This is a test to see HelloWorld in a test that sees HelloWorld in a test"; 
    Pattern pattern = Pattern.compile("HelloWorld"); 
    Matcher matcher = pattern.matcher(temp); 
    int current = 0; 

    while (matcher.find()) { 
     System.out.println(temp.substring(matcher.start(), matcher.end())); 
    } 
1
while (matcher.find()) { 
    start = matcher.start(); 
    end = matcher.end(); 
    System.out.println(temp.substring(start, end)); 
} 

會做你想要什麼。