2012-04-27 4 views
80

Wenn ich versuche,Wie kann ich eine JavaScript-Zeichenfolge durch Leerzeichen oder Komma trennen?

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

ich die folgende

[ 'my, tags are, in here' ] 

Während ich will

['my', 'tags', 'are', 'in', 'here'] 
+3

don‘ meinst du whitespace * oder * komma? – KaptajnKold

+1

Als Erklärung für das Ergebnis, das Sie bekommen: '" meine, Tags sind, hier drin ".split (", ")' wird die Zeichenfolge nur dort teilen, wo ein Leerzeichen _durch ein Komma als Trennzeichen folgt. Ihre Zeichenfolge enthält diese Sequenz nicht, daher wird sie nicht aufgeteilt. '" meine, Tags sind, in hier ".split (", ")' mit der Splitting-Sequenz vertauscht wird mindestens Ihre ursprüngliche Zeichenfolge in drei Teile, nach jedem Komma und Leerzeichen. Wenn Sie fünf Teile haben möchten, geben die Antworten unten die Übereinstimmungszeichenfolge als regulären Ausdruck an, der einem Leerzeichen oder einem Komma entspricht. –

Antwort

160

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

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

Dieser spezielle Regex teilt sich in einer Folge von einem oder mehreren Kommas oder Leerzeichen auf, so dass z.B. Mehrere aufeinanderfolgende Leerzeichen oder eine Komma + Leerzeichen-Sequenz erzeugen keine leeren Elemente in den Ergebnissen.

+16

Was ist mit '/,? \ S + /'? – Bergi

+1

Das funktioniert auch. – gabitzish

+4

@Bergi: Nun, es ist sowohl strenger als das, was ich vorschlage (nur ein Komma erlaubt, vorne) als auch lockerer (auf alle Leerzeichen aufgeteilt) als das, was das OP verlangt hat. IMHO wäre es einfach schlechter - beachte die Eingabe 'Leerzeichen, vor Kommas '. – Jon

11
"my, tags are, in here".split(/[ ,]+/) 

das Ergebnis:

["my", "tags", "are", "in", "here"] 
2

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

... \s* Streichhölzer null oder mehr Leerzeichen (nicht nur Räume, sondern auch Tabs und Zeilenumbrüche).

... [\s,] entspricht ein weißes Leerzeichen oder ein Komma

Wenn Sie leere Elemente von Eingabe wie "foo,bar,,foobar" vermeiden wollen, dies den Trick tun wird:

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

Die + Streichhölzer ein oder mehrere der vorhergehenden Zeichen oder Gruppen.

Edit:

Added ? hinter dem Komma, die Null oder Eins Komma entspricht.

Edit 2:

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

+0

Nop. Das ist nicht gut. Dies ist die Ausgabe: ["my", "tags sind", "hier"] – gabitzish

+0

Es sollte jetzt behoben werden. – KaptajnKold

+0

scheint es sich auf jedes Zeichen zu teilen. – Marco

1

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

28

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

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

var str = 'whatever your text is...'; 
str.split(/[ ,]+/).filter(Boolean); 
+5

Das ist eine sehr clevere Verwendung von impliziten Konstruktoren nativen Objekts - meine Computer-Tastatur ist heute Morgen verrückt - ich werde diesen Kommentar später bearbeiten - aber Punkt ruft Boolean auf wie 'Boolean()' wird eine neue Instanz von [Objekt Boolean] mit erstellen ein Wert von false, genau wie das Aufrufen von 'new Boolean()'. Dadurch werden alle Übereinstimmungen bis auf dieses Standardverhalten herausgefiltert. Nice one :) – VLostBoy

+0

danke! Ich habe herausgefunden, dass es ein sehr nützlicher Trick ist. – jonschlinkert

+0

was genau meinst du mit "natürlichen Sätzen"? Ich konnte es nicht nachahmen, noch verstehe ich, was das tun soll. – cregox

11

Sie regex verwenden können, um eine beliebige Länge von Leerraum zu fangen, und dies wäre wie:

 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" 
Verwandte Themen