Ich bin auf der Suche nach einem Weg zu effektiv (wie in: mit so wenig Ressourcen wie möglich) ersetzen orrurances von Zeichenfolgen durch andere Zeichenfolgen in Javascript. Der Fokus liegt auf Rechenzeit, mehr als Speicherverbrauch.Javascript: effektive Array-basierte Ersetzung in Strings
Suchbegriffe und Ersetzungen werden als Objekt verwendet als Wörterbuch gegeben
var replacements = {
search : 'replace',
another : 'replacement',
'and one' : 'more'
}
Zeit die Tasten ich bin Iterieren über und den Aufbau einer regexp (mit Set g-Flag) aus ihnen heraus, dann jedes Spiel sehen im Wörterbuch und ersetzt es:
String.prototype.mapReplace = function (map, replaceFullOnly = false) {
var regexp = [];
for (var key in map) {
regexp.push(RegExp.escape(key));
}
regexp = regexp.join('|');
if (replaceFullOnly) {
regexp = '\\b(?:' + regexp + ')\\b';
}
regexp = new RegExp(regexp, 'gi');
return this.replace(regexp, function (match) {
return map[match.toLowerCase()];
});
}
Dies funktioniert aber ich brauche eine neue regelmäßige expresison jedes Mal zu kompilieren. Meine Frage ist: Kann jemand eine effektive Möglichkeit finden, die regulären Expresionen zwischenzuspeichern und, wenn die gleiche Karte (wie in "gleichen Schlüsseln", weder "dasselbe Objekt" noch "gleiche Werte" noch "gleiche Reihenfolge der Schlüssel") ist wieder gegeben, die regulären expresiosn wird wiederverwendet?
Eine naheliegende Methode wäre das Sortieren, Serialisieren und Hashing von Schlüsseln. Verwenden Sie sie als Schlüssel, um die reguläre Ausdrucke zu speichern und gespeicherte reguläre Ausdrücke wiederzuverwenden, wenn sie in zukünftigen Aufrufen vorhanden sind. Allerdings werde ich wahrscheinlich mehr Zeit als das Erstellen einer neuen regulären expresiosn jedes Mal benötigen ...
Ideen/Eingabe?
Edit: Regexp.escape() ist eine Funktion, die in regulären Ausdrücken Sonderzeichen in Zeichenketten für den Einsatz entkommt:
RegExp.escape= function(s) {
return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
};
Nutzungsinformationen:
- Ersatz sind viel getan, wie dies ich in einem Chat-System verwendet
- Änderungen an der Ersatzkarten sind selten, jedoch hängt es davon ab, wie Chat-Betreiber die Funktion nutzen. Automatisierte Skripte zum automatischen und häufigen Hinzufügen und Entfernen von Ersetzungsregeln sind möglich. Änderungen an der Ersetzungszuordnung werden jedoch immer seltener vorgenommen als die Ersatzzuordnung für Zeichenfolgen.
- eine oder mehrere Ersatzkarten können gleichzeitig und unabhängig voneinander verwendet werden.
tun Sie einige Beispiele haben, was die mapreplace tut? –
Warum werden die kompilierten Regexes nicht explizit zwischengespeichert? Übergeben Sie nicht jedes Mal verschiedene Kartenobjekte. – Bergi
@NinaScholz Es wird in einem Chat-System verwendet, in dem der Benutzer neue Ersetzungsregeln dynamisch festlegen kann. Es existieren verschiedene Regelsätze für verschiedene Benutzer. –