92

我们得到一个字符串,say,"itiswhatitis"和一个子字符串,say "is",。我需要找到字符串在原始字符串中第二次出现的'i'索引"is"

String.indexOf("is")在这种情况下将返回 2。在这种情况下,我希望输出为 10。

4

8 回答 8

195

使用 的重载版本indexOf(),它将起始索引 (fromIndex) 作为第二个参数:

str.indexOf("is", str.indexOf("is") + 1);
于 2013-09-26T18:30:40.907 回答
50

我正在使用: Apache Commons Lang:StringUtils.ordinalIndexOf()

StringUtils.ordinalIndexOf("Java Language", "a", 2)
于 2016-02-02T13:37:50.090 回答
35
int first = string.indexOf("is");
int second = string.indexOf("is", first + 1);

此重载开始从给定索引中查找子字符串。

于 2013-09-26T18:30:31.450 回答
1

您可以编写一个函数来返回出现位置的数组,Java 有 String.regionMatches 函数,非常方便

public static ArrayList<Integer> occurrencesPos(String str, String substr) {
    final boolean ignoreCase = true;
    int substrLength = substr.length();
    int strLength = str.length();

    ArrayList<Integer> occurrenceArr = new ArrayList<Integer>();

    for(int i = 0; i < strLength - substrLength + 1; i++) {
        if(str.regionMatches(ignoreCase, i, substr, 0, substrLength))  {
            occurrenceArr.add(i);
        }
    }
    return occurrenceArr;
}
于 2014-05-18T05:12:01.630 回答
1

我希望我没有迟到。这是我的答案。我喜欢使用 Pattern/Matcher,因为它使用了应该更有效的正则表达式。然而,我认为这个答案可以得到加强:

    Matcher matcher = Pattern.compile("is").matcher("I think there is a smarter solution, isn't there?");
    int numOfOcurrences = 2;
    for(int i = 0; i < numOfOcurrences; i++) matcher.find();
    System.out.println("Index: " + matcher.start());
于 2021-01-20T18:24:29.177 回答
0

我认为可以使用循环。

1 - check if the last index of substring is not the end of the main string.
2 - take a new substring from the last index of the substring to the last index of the main string and check if it contains the search string
3 - repeat the steps in a loop
于 2013-09-26T18:32:51.460 回答
0

如果您想查找超过 2 次的索引:

public static int ordinalIndexOf(String fullText,String subText,int pos){

    if(fullText.contains(subText)){
        if(pos <= 1){
            return fullText.indexOf(subText);
        }else{
            --pos;
            return fullText.indexOf(subText, ( ordinalIndexOf(fullText,subText,pos) + 1) );
        }
    }else{
        return -1;
    }

}
于 2020-12-20T12:31:05.917 回答
0

这似乎是一个很好的聚会......我在:

public static int nthIndexOf(String str, String subStr, int count) {
    int ind = -1;
    while(count > 0) {
        ind = str.indexOf(subStr, ind + 1);
        if(ind == -1) return -1;
        count--;
    }
    return ind;
}
于 2021-05-31T08:48:31.897 回答