Ähnlich wie bei einer Frage gepostet hier , ist auf der Suche nach einer Lösung in Java.
Das heißt, wie findet man den Index des n-ten Auftretens eines Zeichens / einer Zeichenfolge aus einer Zeichenfolge?
Beispiel: " / folder1 / folder2 / folder3 / ". Wenn ich in diesem Fall nach dem dritten Auftreten eines Schrägstrichs (/) frage, wird dieser vor Ordner3 angezeigt, und ich erwarte, diese Indexposition zurückzugeben. Meine eigentliche Absicht ist es, es vom n-ten Auftreten eines Zeichens zu trennen.
Gibt es eine bequeme / gebrauchsfertige Methode in der Java-API oder müssen wir selbst eine kleine Logik schreiben, um dies zu lösen?
Ebenfalls,
- Ich habe schnell gesucht, ob eine Methode für diesen Zweck bei Apache Commons Langs StringUtils unterstützt wird , aber ich finde keine.
- Können reguläre Ausdrücke dabei helfen?
Antworten:
Wenn Ihr Projekt bereits von Apache Commons abhängt, können Sie es verwenden
StringUtils.ordinalIndexOf
. Andernfalls finden Sie hier eine Implementierung:Dieser Beitrag wurde bereits als ein Artikel neu geschrieben hier .
quelle
lastIndexOf
.Ich glaube, die einfachste Lösung, um das N-te Vorkommen eines Strings zu finden, ist die Verwendung von StringUtils.ordinalIndexOf () von Apache Commons.
Beispiel:
quelle
Es gibt zwei einfache Optionen:
charAt()
wiederholtindexOf()
wiederholtBeispielsweise:
Das funktioniert vielleicht nicht so gut wie das
indexOf
wiederholte Verwenden , aber es ist möglicherweise einfacher, es richtig zu machen.quelle
Sie können so etwas ausprobieren:
Beachten Sie, dass ich im regulären Ausdruck einige Annahmen getroffen habe:
Wie in einem Kommentar angefordert, werde ich versuchen, den regulären Ausdruck zu erklären:
(/[^/]*){2}/([^/]*)
/[^/]*
ist ein/
gefolgt von[^/]*
(eine beliebige Anzahl von Zeichen, die kein a sind/
),(/[^/]*)
gruppiert den vorherigen Ausdruck in einer einzelnen Entität. Dies ist die1
erste Gruppe des Ausdrucks.(/[^/]*){2}
bedeutet, dass die Gruppe genau übereinstimmen muss{2}
,[^/]*
ist wieder eine beliebige Anzahl von Zeichen, die nicht a/
,([^/]*)
gruppiert den vorherigen Ausdruck in einer einzigen Entität. Dies ist die2
zweite Gruppe des Ausdrucks.Auf diese Weise müssen Sie nur den Teilstring erhalten, der der 2. Gruppe entspricht:
return m.group(2);
Bild mit freundlicher Genehmigung von Debuggex
quelle
Ich habe ein paar Änderungen an der Antwort von aioobe vorgenommen und eine n-te lastIndexOf-Version erhalten und einige NPE-Probleme behoben. Siehe Code unten:
quelle
null
als Argument angegeben wird. Dies ist das häufigste Verhalten in der Standardbibliothek.Passen Sie alles an, gefolgt von / zweimal, dann noch einmal. Der dritte ist der, den Sie wollen
Der Matcher- Status kann verwendet werden, um festzustellen , wo sich das letzte / befindet
quelle
quelle
Heutzutage gibt es Unterstützung für Apache Commons Langs StringUtils ,
Dies ist das Grundelement:
Für Ihr Problem können Sie Folgendes codieren:
StringUtils.ordinalIndexOf(uri, "/", 3)
Sie können auch das letzte n-te Vorkommen eines Zeichens in einer Zeichenfolge mit der lastOrdinalIndexOf- Methode finden.
quelle
Möglicherweise können Sie dies auch über die String.split (..) -Methode erreichen.
quelle
Ein anderer Ansatz:
quelle
Diese Antwort verbessert die Antwort von @aioobe. Zwei Fehler in dieser Antwort wurden behoben.
1. n = 0 sollte -1 zurückgeben.
2. Das n-te Vorkommen gab -1 zurück, aber es funktionierte bei n-1. Vorkommen.
Versuche dies !
quelle
quelle
quelle
Meine Lösung:
quelle
Der Code gibt die Teilzeichenfolge für n-te Vorkommenspositionen, auch Feldbreite genannt, zurück. Beispiel. Wenn die Zeichenfolge "Stapelüberlauf in niedrigem Melow" die Zeichenfolge für die Suche nach dem zweiten Vorkommen von Token "niedrig" ist, stimmen Sie mir zu, dass das zweite Vorkommen "18 und 21" unterschreitet . indexOfOccurance ("Stapelüberlauf bei niedrigem Melow", niedrig, 2) gibt 18 und 21 in einer Zeichenfolge zurück.
quelle
quelle