Ich versuche, die Positionen aller Vorkommen einer Zeichenfolge in einer anderen Zeichenfolge zu finden, wobei die Groß- und Kleinschreibung nicht berücksichtigt wird.
Beispiel: Geben Sie die Zeichenfolge an:
Ich habe im Libanon Ukulele spielen gelernt.
und die Suchzeichenfolge le
möchte ich das Array erhalten:
[2, 25, 27, 33]
Beide Zeichenfolgen sind Variablen - dh ich kann ihre Werte nicht fest codieren.
Ich dachte, dass dies eine leichte Aufgabe für reguläre Ausdrücke war, aber nachdem ich eine Weile darum gekämpft hatte, eine zu finden, die funktionieren würde, hatte ich kein Glück.
Ich habe dieses Beispiel gefunden, wie dies erreicht werden kann .indexOf()
, aber es muss doch einen präziseren Weg geben, dies zu tun?
quelle
le
hier eine variable Zeichenfolge? Auch wennnew Regexp(str);
die Gefahr von Sonderzeichen lauert, lauert$2.50
zum Beispiel. So etwasregex = new Regexp(dynamicstring.replace(/([\\.+*?\\[^\\]$(){}=!<>|:])/g, '\\$1'));
wäre meiner Meinung nach näher. Ich bin nicht sicher, ob js einen eingebauten Regex-Fluchtmechanismus hat.new RegExp(searchStr)
wäre der Weg, und ja, im allgemeinen Fall müssten Sie Sonderzeichen entkommen. Es lohnt sich nicht wirklich, es sei denn, Sie benötigen dieses Maß an Allgemeinheit.searchStr=aaa
und dasstr=aaaaaa
. Anstatt 4 Vorkommen zu finden, findet Ihr Code nur 2, da SiesearchStr.length
in der Schleife überspringen .Hier ist die kostenlose Version von Regex:
BEARBEITEN : und wenn Sie Zeichenfolgen wie 'aaaa' und 'aa' abgleichen möchten, um [0, 2] zu finden, verwenden Sie diese Version:
quelle
var result = indexes('aaaa', 'aa')
? Erwartetes Ergebnis sollte sein[0, 1, 2]
oder[0, 2]
?i+=find.length;
und in sonsti++
Das können Sie sicher!
Bearbeiten: Lerne RegExp zu buchstabieren
Außerdem wurde mir klar, dass dies nicht genau das ist , was Sie wollen, da
lastIndex
das Ende der Nadel nicht der Anfang ist, aber es ist nah - Sie könntenre.lastIndex-needle.length
in das Ergebnisarray eindringen ...Bearbeiten: Link hinzufügen
Die Antwort von @Tim Down verwendet das Ergebnisobjekt von RegExp.exec (), und alle meine Javascript-Ressourcen beschönigen dessen Verwendung (abgesehen davon, dass Sie die übereinstimmende Zeichenfolge erhalten). Wenn er es benutzt
result.index
, ist das eine Art unbenanntes Match-Objekt. In der MDC-Beschreibung von exec beschreiben sie dieses Objekt tatsächlich sehr detailliert.quelle
Ein Liner mit
String.protype.matchAll
(ES2020):Verwenden Sie Ihre Werte:
Wenn Sie sich Sorgen machen, einen Spread und einen
map()
in einer Zeile zu machen, habe ich ihn mit einerfor...of
Schleife für eine Million Iterationen (unter Verwendung Ihrer Zeichenfolgen) ausgeführt. Der Einzeilerfor...of
beträgt durchschnittlich 1420 ms, während der Durchschnitt auf meiner Maschine 1150 ms beträgt. Das ist kein unbedeutender Unterschied, aber der eine Liner funktioniert gut, wenn Sie nur eine Handvoll Matches machen.Siehe
matchAll
auf caniusequelle
Wenn Sie nur die Position aller Übereinstimmungen finden möchten, möchte ich Sie auf einen kleinen Hack hinweisen:
Es ist möglicherweise nicht anwendbar, wenn Sie ein RegExp mit variabler Länge haben, aber für einige kann es hilfreich sein.
Dies unterscheidet zwischen Groß- und Kleinschreibung. Bei Unempfindlichkeit gegen Groß- und Kleinschreibung verwenden Sie
String.toLowerCase
vorher die Funktion.quelle
Hier ist ein einfacher Code
quelle
Folgen Sie der Antwort von @jcubic, seine Lösung hat eine kleine Verwirrung für meinen Fall verursacht.
Zum Beispiel wird
var result = indexes('aaaa', 'aa')
sie[0, 1, 2]
anstelle von zurückgegeben.[0, 2]
Also habe ich seine Lösung wie folgt ein wenig aktualisiert, um sie meinem Fall anzupassen
quelle
Vielen Dank für alle Antworten. Ich habe sie alle durchgesehen und eine Funktion entwickelt, die dem ersten einen letzten Index jedes Auftretens des "Nadel" -Substrings gibt. Ich poste es hier, falls es jemandem hilft.
Bitte beachten Sie, dass dies nicht mit der ursprünglichen Anfrage nur für den Beginn jedes Auftretens identisch ist. Es passt besser zu meinem Anwendungsfall, weil Sie die Nadellänge nicht einhalten müssen.
quelle
Überprüfen Sie diese Lösung, die auch dieselbe Zeichenfolge finden kann. Lassen Sie mich wissen, ob etwas fehlt oder nicht.
quelle
quelle
Der folgende Code erledigt die Aufgabe für Sie:
quelle
Verwenden Sie String.prototype.match .
Hier ist ein Beispiel aus den MDN-Dokumenten selbst:
quelle