773 Stimmen

Wie kann ich eine Zeichenkette mit mehreren Trennzeichen in JavaScript aufteilen?

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.

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.

999voto

Aaron Maenpaa Punkte 112919

Ü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!"

6 Stimmen

Was verwenden Sie für Ihre js>-Konsole?

7 Stimmen

Rhino, Mozillas Implementierung von JavaScript in Java: mozilla.org/rhino (... oder "sudo apt-get install rhino").

0 Stimmen

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

358voto

Jesse Rusak Punkte 55372

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.

4 Stimmen

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"

1 Stimmen

Diese Methode funktioniert besser als Zeichenklassen, wenn Sie sich auf mehr als ein Zeichen aufteilen müssen. Trennen Sie sie durch | wie Jesse zeigt.

0 Stimmen

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.

111voto

Brian Punkte 2602

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ß!

3 Stimmen

Warum schreiben Sie for(var i = 0; i < tokens.length; i++) und nicht for(var i = 1; i < tokens.length; i++) ?

0 Stimmen

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 :).

2 Stimmen

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.

32voto

Asher Punkte 2458

Wir wollen es einfach halten: (fügen Sie ein "[ ]+" zu Ihrem RegEx hinzu, das bedeutet "1 oder mehr")

Das bedeutet, dass "+" und "{1,}" dasselbe sind.

var words = text.split(/[ .:;?!~,`"&|()<>{}\[\]\r\n/\\]+/); // note ' and - are kept

3 Stimmen

Ein "+" am Ende bedeutet 1 oder mehr

11 Stimmen

Ich würde sagen, das ist minimal, nicht einfach

1 Stimmen

Für das + und das - :-D, aber auch \s anstelle des Leerzeichens: var words = text.split(/[ \s. :;?!~,`"&|()<>{}\=\+\-[] \r\n /\]+/);

15voto

Knifflige Methode:

var s = "dasdnk asd, (naks) :d skldma";
var a = s.replace('(',' ').replace(')',' ').replace(',',' ').split(' ');
console.log(a);//["dasdnk", "asd", "naks", ":d", "skldma"]

6 Stimmen

Dies ist falsch, weil .replace() nicht alle Elemente ersetzt :/

3 Stimmen

Können Sie ändern '(' para /(/g alle zu ersetzen ( Elemente - g ist die weltweit Flagge für RegExp - es wird also nach allen Vorkommen von ( nicht der erste

CodeJaeger.com

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.

Powered by:

X