我们会给一个字符串,比如"itiswhatitis"
和一个子字符串,比如"is"
。
当字符串'i'
在原始字符串中第二次出现时,我需要找到"is"
的索引。
String.indexOf("is")
将返回2。在这种情况下,我希望输出为10。
答案 0 :(得分:118)
使用indexOf()
的重载版本,它将起始索引(fromIndex)作为第二个参数:
str.indexOf("is", str.indexOf("is") + 1);
答案 1 :(得分:26)
int first = string.indexOf("is");
int second = string.indexOf("is", first + 1);
此重载开始从给定索引中查找子字符串。
答案 2 :(得分:21)
我正在使用: Apache Commons Lang: StringUtils.ordinalIndexOf()
StringUtils.ordinalIndexOf("Java Language", "a", 2)
答案 3 :(得分: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());
答案 4 :(得分: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
答案 5 :(得分:0)
你可以写一个函数来返回出现位置的数组,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;
}
答案 6 :(得分: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;
}
}
答案 7 :(得分: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;
}