Finden des zweiten Vorkommens eines Teilstrings in einem String in Java

Lesezeit: 3 Minuten

Benutzer-Avatar
AmanArora

Uns wird eine Zeichenfolge gegeben, sagen wir, "itiswhatitis" und eine Teilzeichenfolge, sagen wir, "is". Ich muss den Index von finden 'i' wenn die Saite "is" kommt ein zweites Mal in der ursprünglichen Zeichenfolge vor.

String.indexOf("is") gibt in diesem Fall 2 zurück. Ich möchte, dass die Ausgabe in diesem Fall 10 ist.

Benutzer-Avatar
Rohit Jain

Verwenden Sie die überladene Version von indexOf()die den Startindex (fromIndex) als 2. Parameter übernimmt:

str.indexOf("is", str.indexOf("is") + 1);

  • Das ist genial.

    – Sofas1

    9. März 2019 um 22:41 Uhr

Ich benutze:
Apache Commons Lang: StringUtils.ordinalIndexOf()

StringUtils.ordinalIndexOf("Java Language", "a", 2)

  • Schön und klar, danke!

    – Osmar

    18. Januar um 3:39 Uhr

int first = string.indexOf("is");
int second = string.indexOf("is", first + 1);

Diese Überladung beginnt mit der Suche nach der Teilzeichenfolge aus dem angegebenen Index.

  • Was ist, wenn das Vorkommen mehr als zweimal ist?

    – Pravat Panda

    26. September 2013 um 18:33 Uhr

  • Dann passiert nichts Besonderes, es dauert immer noch das zweite Auftreten.

    – Jeroen Vannevel

    26. September 2013 um 18:34 Uhr

  • was ist mit dem Index des dritten Vorkommens!

    – Pravat Panda

    26. September 2013 um 18:34 Uhr

  • Was ist damit? Die Frage war, das zweite Vorkommen zu finden.

    – Jeroen Vannevel

    26. September 2013 um 18:35 Uhr

  • @PravatPanda: Ich denke, Sie möchten wissen, wie Sie das dritte Vorkommen erhalten? Dann könnten Sie den Code in Jeroens Antwort einfach fortsetzen und einen dritten hinzufügen string.indexOf("is", second + 1); obwohl es wahrscheinlich besser wäre, eine Methode zu erstellen, die den N-ten indexOf zurückgibt

    – Juha Untinen

    27. August 2014 um 8:44 Uhr

Sie können eine Funktion schreiben, um ein Array von Vorkommenspositionen zurückzugeben. Java hat die Funktion String.regionMatches, die sehr praktisch ist

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;
}

Ich hoffe, ich komme nicht zu spät zur Party. Hier ist meine Antwort. Ich verwende Pattern/Matcher gerne, weil es Regex verwendet, was effizienter sein sollte. Ich denke jedoch, dass diese Antwort verbessert werden könnte:

    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());

  • Schöne Lösung, fand ich. Danke Hasnaa!

    – Hassan Jamil

    26. Mai 2021 um 14:01 Uhr

Benutzer-Avatar
Pravat Panda

Ich denke, eine Schleife kann verwendet werden.

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

  • Schöne Lösung, fand ich. Danke Hasnaa!

    – Hassan Jamil

    26. Mai 2021 um 14:01 Uhr

Benutzer-Avatar
Said Arianmanesh

Wenn Sie den Index für mehr als 2 Vorkommen finden möchten:

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;
    }

}

1269230cookie-checkFinden des zweiten Vorkommens eines Teilstrings in einem String in Java

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy