Was ist der schnellste Weg, um das n- te Vorkommen einer Zeichenfolge innerhalb einer Zeichenfolge zu ermitteln, es sei denn, mir fehlt eine offensichtliche integrierte Methode ?
Mir ist klar, dass ich die IndexOf- Methode schleifen kann , indem ich ihren Startindex bei jeder Iteration der Schleife aktualisiere. Aber es so zu machen, scheint mir verschwenderisch.
Antworten:
Das ist im Grunde das, was Sie tun müssen - oder zumindest die einfachste Lösung. Alles, was Sie "verschwenden" würden, sind die Kosten für n Methodenaufrufe - Sie werden keinen Fall zweimal überprüfen, wenn Sie darüber nachdenken. (IndexOf kehrt zurück, sobald die Übereinstimmung gefunden wurde, und Sie werden dort weitermachen, wo es aufgehört hat.)
quelle
StringUtils.ordinalIndexOf()
. C # mit all dem Linq und anderen wunderbaren Funktionen hat einfach keine eingebaute Unterstützung dafür. Und ja, es ist sehr wichtig, Unterstützung zu haben, wenn Sie mit Parsern und Tokenizern zu tun haben.string
:)Sie könnten den regulären Ausdruck wirklich verwenden
/((s).*?){n}/
, um nach dem n-ten Auftreten von Teilzeichenfolgen zu suchens
.In C # könnte es so aussehen:
Hinweis: Ich habe
Regex.Escape
die ursprüngliche Lösung hinzugefügt , um die Suche nach Zeichen zu ermöglichen, die für die Regex-Engine eine besondere Bedeutung haben.quelle
value
? In meinem Fall suchte ich nach einem Punkt msdn.microsoft.com/en-us/library/…Hier ist die rekursive Implementierung (der obigen Idee ) als Erweiterungsmethode, die das Format der Framework-Methode (n) nachahmt:
Außerdem sind hier einige (MBUnit) Unit-Tests aufgeführt, die Ihnen helfen könnten (um zu beweisen, dass sie korrekt sind):
quelle
oder in C # mit Erweiterungsmethoden
quelle
index
zunächst -1 festgelegt wird."BOB".IndexOf("B")
0 zurückgegeben wird, sollte diese Funktion auch fürIndexOfOccurence("BOB", "B", 1)
IndexOfOccurence
nicht überprüfts
wird, ob dies der Fall istnull
. Und String.IndexOf (String, Int32) werfen wird ,ArgumentNullException
wennmatch
istnull
.Vielleicht wäre es auch schön, mit der
String.Split()
Methode zu arbeiten und zu überprüfen, ob sich das angeforderte Vorkommen im Array befindet, wenn Sie nicht den Index, sondern den Wert am Index benötigenquelle
Nach einigem Benchmarking scheint dies die einfachste und effizienteste Lösung zu sein
quelle
System.ValueTuple ftw:
var index = line.Select((x, i) => (x, i)).Where(x => x.Item1 == '"').ElementAt(5).Item2;
eine Funktion daraus zu schreiben ist Hausaufgabe
quelle
Tods Antwort kann etwas vereinfacht werden.
Ausgabe
quelle
Oder so ähnlich mit der do while-Schleife
quelle
Dies könnte es tun:
quelle