Wie kann ich eine Zeichenkette mit mehreren Trennzeichen in JavaScript aufteilen?
Ich versuche, beides zu trennen Kommas y Räume aber AFAIK ist JavaScript's split()
Funktion unterstützt nur ein Trennzeichen.
Wie kann ich eine Zeichenkette mit mehreren Trennzeichen in JavaScript aufteilen?
Ich versuche, beides zu trennen Kommas y Räume aber AFAIK ist JavaScript's split()
Funktion unterstützt nur ein Trennzeichen.
Übergeben Sie einen Regexp als Parameter:
js> "Hello awesome, world!".split(/[\s,]+/)
Hello,awesome,world!
Bearbeitet um hinzuzufügen:
Sie können das letzte Element erhalten, indem Sie die Länge des Arrays minus 1 wählen:
>>> bits = "Hello awesome, world!".split(/[\s,]+/)
["Hello", "awesome", "world!"]
>>> bit = bits[bits.length - 1]
"world!"
... und wenn das Muster nicht übereinstimmt:
>>> bits = "Hello awesome, world!".split(/foo/)
["Hello awesome, world!"]
>>> bits[bits.length - 1]
"Hello awesome, world!"
Rhino, Mozillas Implementierung von JavaScript in Java: mozilla.org/rhino (... oder "sudo apt-get install rhino").
Dank. eine andere Frage im Zusammenhang mit diesem, was ich tun müssen, ist das letzte Element des aufgeteilten Arrays zu erhalten. wenn es kein Array sollte es die Zeichenfolge thx zurückgeben
Sie können einen Regex an die JavaScript-Funktion split() Methode. Zum Beispiel:
"1,2 3".split(/,| /)
["1", "2", "3"]
Oder, wenn Sie Folgendes zulassen möchten Mehrfachabscheider zusammen, um als Einheit zu handeln:
"1, 2, , 3".split(/(?:,| )+/)
["1", "2", "3"]
(Sie müssen die nicht fangende (?:)
Klammer, da sie sonst in das Ergebnis zurückgespleißt wird. Oder Sie können so schlau sein wie Aaron und eine Zeichenklasse verwenden).
Beispiele getestet in Safari und Firefox.
Wenn Sie mehrere Zeichen als ein einziges benötigen, z. B. "eins;#zwei;#neues Trikot", können Sie einfach die Zeichenfolge ";#" an die Split-Funktion übergeben. "eins;#zwei;#neues jersey".split(";#")[2] === "neues jersey"
Diese Methode funktioniert besser als Zeichenklassen, wenn Sie sich auf mehr als ein Zeichen aufteilen müssen. Trennen Sie sie durch |
wie Jesse zeigt.
Ich frage mich, ob es eine Möglichkeit gibt, das Entfernen der Trennzeichen zu vermeiden, wenn man eine Zeichenfolge mit einem regulären Ausdruck aufteilt: In diesem Beispiel werden die Trennzeichen entfernt, aber ich hoffe, dass es möglich ist, eine Zeichenfolge aufzuteilen, ohne sie zu entfernen.
Eine weitere einfache, aber effektive Methode ist die wiederholte Verwendung von Split + Join.
"a=b,c:d".split('=').join(',').split(':').join(',').split(',')
Im Wesentlichen tun einen Split, gefolgt von einer Verbindung ist wie eine globale ersetzen, so dass diese ersetzt jedes Trennzeichen mit einem Komma dann, sobald alle ersetzt werden es tut eine endgültige Split auf Komma
Das Ergebnis des obigen Ausdrucks ist:
['a', 'b', 'c', 'd']
Darüber hinaus könnte man sie auch in eine Funktion einbauen:
function splitMulti(str, tokens){
var tempChar = tokens[0]; // We can use the first token as a temporary join character
for(var i = 1; i < tokens.length; i++){
str = str.split(tokens[i]).join(tempChar);
}
str = str.split(tempChar);
return str;
}
Verwendung:
splitMulti('a=b,c:d', ['=', ',', ':']) // ["a", "b", "c", "d"]
Wenn Sie diese Funktion häufig nutzen, ist es vielleicht sogar eine Überlegung wert, sie zu verpacken. String.prototype.split
für die Bequemlichkeit (ich denke, meine Funktion ist ziemlich sicher - die einzige Überlegung ist der zusätzliche Overhead der Conditionals (geringfügig) und die Tatsache, dass es eine Implementierung des Limit-Arguments fehlt, wenn ein Array übergeben wird).
Achten Sie darauf, dass Sie die splitMulti
Funktion, wenn Sie diesen Ansatz verwenden, um die unten einfach wickelt es :). Auch erwähnenswert, dass einige Leute auf die Erweiterung built-ins Stirnrunzeln (wie viele Menschen tun es falsch und Konflikte auftreten können), so dass im Zweifelsfall sprechen Sie mit jemandem mehr Senior vor der Verwendung dieser oder fragen Sie auf SO :)
var splitOrig = String.prototype.split; // Maintain a reference to inbuilt fn
String.prototype.split = function (){
if(arguments[0].length > 0){
if(Object.prototype.toString.call(arguments[0]) == "[object Array]" ) { // Check if our separator is an array
return splitMulti(this, arguments[0]); // Call splitMulti
}
}
return splitOrig.apply(this, arguments); // Call original split maintaining context
};
Verwendung:
var a = "a=b,c:d";
a.split(['=', ',', ':']); // ["a", "b", "c", "d"]
// Test to check that the built-in split still works (although our wrapper wouldn't work if it didn't as it depends on it :P)
a.split('='); // ["a", "b,c:d"]
Viel Spaß!
Warum schreiben Sie for(var i = 0; i < tokens.length; i++)
und nicht for(var i = 1; i < tokens.length; i++)
?
Diese Optimierung hatte ich übersehen, Sie haben Recht, wir können bei tokens[1]
um eine Iteration zu speichern als tokens[0] == tempchar
und wir teilen uns auf tempchar
nach Iteration über tokens
zu Ende zu bringen. Ich werde die Antwort entsprechend aktualisieren, danke @tic :).
Es ist nicht ratsam, mit Prototypen zu spielen. Die Overhead-Überlegungen sind wegen der Optimierungen, die tief im Inneren stattfinden, sehr schwer zu erkennen. Sie können in C eine Markierung auslösen, die besagt, dass die Annahme X nicht mehr sicher ist, wenn der Prototyp geändert wurde, und auf diesen [viel langsameren] Codepfad für eine Vielzahl von Funktionen zurückgreifen. Was wie "geringer Overhead" aussieht, kann die Ausführung von ansonsten optimiertem Code um Größenordnungen verlangsamen.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
6 Stimmen
Ich hatte dieses Problem, als ich versuchte, Dateipfade aufzuteilen, die mit nodejs unter Windows erstellt wurden. Manchmal gab es Schrägstriche vorwärts "/" und rückwärts "\" im selben Pfad.