2011-04-15 151 views
5

我有一個字符串,它是一個HTML頁面的完整內容,我試圖找到第二次出現的索引</table>。有沒有人有關於如何實現這一目標的任何建議?在java中找到字符串中第n個子字符串的出現?

+0

@Jon:你怎麼知道這是作業? @Tijo:是嗎?或者你是否正在嘗試在你正在編寫的真實程序中做到這一點。只要你說,家庭作業就沒問題。 – 2011-04-15 14:25:50

+0

我想象它與這些相似;)http://www.google.co.uk/search?q=find+the+nth+occurence+of+a+substring+in+a+string+in+java – 2011-04-15 14:26:38

+0

是在我的問題有任何問題..?我有一個字符串,這是一個hhtml頁面的完整內容..我想知道第二次發生的指數「」我... – 2011-04-15 14:32:03

回答

6

這是一個有趣的鏡頭;)

public static int findNthIndexOf (String str, String needle, int occurence) 
      throws IndexOutOfBoundsException { 
    int index = -1; 
    Pattern p = Pattern.compile(needle, Pattern.MULTILINE); 
    Matcher m = p.matcher(str); 
    while(m.find()) { 
     if (--occurence == 0) { 
      index = m.start(); 
      break; 
     } 
    } 
    if (index < 0) throw new IndexOutOfBoundsException(); 
    return index; 
} 
4

首先找到第一個索引,然後再尋找第二個指標開始從第一個索引搜索+1

String string = "first</table>second</table>"; 
int firstIndex = string.indexOf("</table>"); 
int secondIndex = string.indexOf("</table>", firstIndex+1); 
System.out.println("second index: " + secondIndex); 

這是一些非常基本的代碼順便說一句,你將要建立一些額外的檢查(指數!= -1等) 同樣在你的文章標題中,它表示第n次出現,但在你的文章中你特別提到了第二次出現。如果你確實需要第n次出現,我相信你能從這裏弄清楚。

5

查找字符串的第N次出現另一個好的選擇是使用StringUtils.ordinalIndexOf()從Apache的百科全書:

StringUtils.ordinalIndexOf("aabaabaa", "b", 2) == 5 
7

@BasVanDenBroek's answer的推廣,使用indexOf:

public static int nthIndexOf(String source, String sought, int n) { 
    int index = source.indexOf(sought); 
    if (index == -1) return -1; 

    for (int i = 1; i < n; i++) { 
     index = source.indexOf(sought, index + 1); 
     if (index == -1) return -1; 
    } 
    return index; 
} 

快速和骯髒的測試:

public static void main(String[] args) throws InterruptedException { 
    System.out.println(nthIndexOf("abc abc abc", "abc", 1)); 
    System.out.println(nthIndexOf("abc abc abc", "abc", 2)); 
    System.out.println(nthIndexOf("abcabcabc", "abc", 2)); 
    System.out.println(nthIndexOf("abcabcabc", "abc", 3)); 
    System.out.println(nthIndexOf("abc abc abc", "abc", 3)); 
    System.out.println(nthIndexOf("abc abc defasabc", "abc", 3)); 
    System.out.println(nthIndexOf("abc abc defasabc", "abc", 4)); 
} 
0

https://stackoverflow.com/a/5678546/15789https://stackoverflow.com/a/14356988/15789進一步工作(由於原來的海報@ sebastiaan-VAN-DEN-布魯克和@assylias)。

獲取數組中的所有索引。然後你可以得到任何第n個索引。在許多情況下,可能需要多次獲取字符串中第n個子串的索引。獲得一個數組並多次訪問可能會更容易。

public static int[] getIndices(String source, String substr) { 
    List<Integer> indicesList = null; 
    int index = source.indexOf(substr); 
    if (index == -1) { 
     return new int[0]; 
    } else { 
     indicesList = new ArrayList<>(); 
     indicesList.add(index); 
    } 

    while (index != -1) { 
     index = source.indexOf(substr, index + 1); 
     if (index != -1) { 
      indicesList.add(index); 
     } 
    } 

    // Integer[] iarr = new int[1]; 
    //Autoboxing does not work with arrays. Run loop to convert. 
    //toArray does not convert Integer[] to int[] 
    int[] indices = new int[indicesList.size()]; 
    for (int i = 0; i < indicesList.size(); i++) { 
     indices[i] = indicesList.get(i); 
    } 
    return indices; 
} 
相關問題