Wie kann ich eine JavaScript-Zeichenfolge durch Leerzeichen oder Komma teilen?

123

Wenn ich es versuche

"my, tags are, in here".split(" ,")

Ich verstehe folgendes

[ 'my, tags are, in here' ]

Während ich will

['my', 'tags', 'are', 'in', 'here']
Hoa
quelle
4
meinst du nicht Leerzeichen oder Komma?
KaptajnKold
1
Als Erklärung für das Ergebnis, das Sie erhalten: "my, tags are, in here".split(" ,")Teilt die Zeichenfolge nur dort, wo ein Leerzeichen gefolgt von einem Komma das Trennzeichen ist. Ihre Zeichenfolge enthält diese Sequenz nicht, daher wird sie nicht aufgeteilt. "my, tags are, in here".split(", ")Wenn Sie die Teilungssequenz vertauschen, wird Ihre ursprüngliche Zeichenfolge nach jedem Komma und Leerzeichen mindestens in drei Teile geteilt. Wenn Sie fünf Teile möchten, geben die folgenden Antworten die Übereinstimmungszeichenfolge als regulären Ausdruck an, der mit einem Leerzeichen oder einem Komma übereinstimmt .
Jochem Schulenklopper

Antworten:

233

String.split kann auch einen regulären Ausdruck akzeptieren:

input.split(/[ ,]+/);

Dieser bestimmte reguläre Ausdruck wird in eine Folge von einem oder mehreren Kommas oder Leerzeichen aufgeteilt, sodass z. B. mehrere aufeinanderfolgende Leerzeichen oder eine Komma + Leerzeichenfolge keine leeren Elemente in den Ergebnissen erzeugen.

Jon
quelle
22
Was ist mit /,?\s+/?
Bergi
4
@Bergi: Nun, es ist sowohl strenger als das, was ich vorschlage (nur ein Komma erlaubt, vorne) und lockerer (auf alle Leerzeichen aufgeteilt) als das, was das OP verlangt hat. IMHO wäre es einfach schlimmer - bedenken Sie die Eingabe spaces , before commas.
Jon
@ Jon: OK, das hängt von den Anforderungen des OP ab. Ich würde nicht plenk :-)
Bergi
11
+1 Ich weiß, dass dies ein bisschen alt ist, aber warum ein Leerzeichen verwenden und nicht \s. Ich habe möglicherweise einige Zeilenumbrüche im Blob und \skümmere mich auch darum.
Iambriansreed
6
FACEPALM HINWEIS: Setzen Sie keine Anführungszeichen um den regulären Ausdruck. zB nicht benutzen input.split("/[ ,]+/)". Lassen Sie die Anführungszeichen weg ( input.split(//)statt input.split("//")) und Sie werden eine viel bessere Erfahrung haben. Denn seltsamerweise würde das wirklich wahrscheinlich nur an sich selbst funktionieren (zu generieren ["input.split(\"", ")\""]).
cod3monk3y
41

Der zu verwendende Vorschlag .split(/[ ,]+/)ist gut, aber mit natürlichen Sätzen erhalten Sie früher oder später leere Elemente im Array. zB ['foo', '', 'bar'].

Was in Ordnung ist, wenn das für Ihren Anwendungsfall in Ordnung ist. Aber wenn Sie die leeren Elemente loswerden möchten, können Sie Folgendes tun:

var str = 'whatever your text is...';
str.split(/[ ,]+/).filter(Boolean);
jonschlinkert
quelle
6
Das ist eine sehr clevere Verwendung von impliziten Konstruktoren für native Objekte - meine Computertastatur ist heute Morgen verrückt - ich werde diesen Kommentar später bearbeiten -, aber point ruft Boolean auf, wie 'Boolean ()' eine neue Instanz von [object Boolean] mit a erstellt Wert von false, genau wie beim Aufrufen von 'new Boolean ()'. Dadurch werden alle Übereinstimmungen bis zu diesem Standardverhalten herausgefiltert. Netter :)
VLostBoy
Was genau meinst du mit "natürlichen Sätzen"? Ich konnte es nicht emulieren und verstehe auch nicht, was das tun soll.
Cregox
Es wird von @VLostBoy erklärt. Wenn der Boolean()Konstruktor für einen Wert aufgerufen wird, wandelt er diesen Wert in einen Booleschen Wert um - true oder false. Daher werden alle falschen Werte aus dem Array gefiltert, einschließlich leerer Zeichenfolgen.
Jonschlinkert
1
Übrigens können Sie implizite Konstruktoren für andere ähnliche lustige [1, 2, 3].map(String)
Dinge verwenden
2
"foo, bar,,foobar,".split(/[\s,]+/)kehrt zurück ["foo", "bar", "foobar", ""](wegen des baumelnden Kommas am Ende), danke!
Rafał Cieślak
36

Sie können Regex verwenden, um eine beliebige Länge des Leerraums zu erfassen. Dies wäre wie folgt:

var text = "hoi how     are          you";
var arr = text.split(/\s+/);

console.log(arr) // will result : ["hoi", "how", "are", "you"]

console.log(arr[2]) // will result : "are" 
Cemil Dogan
quelle
Achten Sie bei der Verwendung auf führende / nachfolgende Leerzeichen /\s+/. Zum Beispiel 'a b c '.split(/\s+/) === [ 'a', 'b', 'c', '' ]. Wenn Sie .trim()die Zeichenfolge zuerst, werden Sie gut sein.
Jordan Dodson
12
"my, tags are, in here".split(/[ ,]+/)

Das Ergebnis ist :

["my", "tags", "are", "in", "here"]
gabitzisch
quelle
4

input.split(/\s*[\s,]\s*/)

\s* Entspricht null oder mehr Leerzeichen (nicht nur Leerzeichen, sondern auch Tabulatoren und Zeilenumbrüche).

... [\s,] entspricht einem Leerzeichen oder einem Komma

Wenn Sie leere Elemente aus Eingaben wie vermeiden möchten "foo,bar,,foobar", reicht dies aus:

input.split(/(\s*,?\s*)+/)

Das + entspricht einem oder mehreren der vorhergehenden Zeichen oder Gruppen.

Bearbeiten:

?Nach einem Komma hinzugefügt, das mit null oder einem Komma übereinstimmt.

Bearbeiten 2:

Es stellte sich heraus, dass Bearbeitung 1 ein Fehler war. Behoben. Jetzt muss mindestens ein Komma oder ein Leerzeichen vorhanden sein, damit der Ausdruck eine Übereinstimmung findet.

KaptajnKold
quelle
Nein. Das ist nicht gut. Dies ist die Ausgabe: ["my", "tags are", "in here"]
gabitzish
es scheint sich bei jedem Charakter zu teilen.
Marco
@ Marco Ups. Hätte es wahrscheinlich testen sollen, bevor ich die letzte Bearbeitung vorgenommen habe. Ich habe jetzt, und diesmal sollte es wirklich funktionieren.
KaptajnKold
Hmm, wie ist das besser als die akzeptierte Antwort? "foo,bar,foobar".split(/[ ,]+/)kehrt ["foo", "bar", "foobar"]ebenfalls zurück.
Rafał Cieślak
1
@KaptajnKold Oh, das habe ich nicht verstanden, danke für die Antwort!
Rafał Cieślak
2

Wenn ich zusätzliche Zeichen wie Ihre Kommas berücksichtigen möchte (in meinem Fall kann jedes Token mit Anführungszeichen eingegeben werden), würde ich einen string.replace () ausführen, um die anderen Trennzeichen in Leerzeichen zu ändern und dann in Leerzeichen aufzuteilen.

Grantwparks
quelle
1
str_variable.replace(/[,'"]+/gi, ' ').split(' ')
qräbnö