Comment puis-je diviser une chaîne JavaScript par un espace blanc ou une virgule?


123

Si j'essaye

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

Je reçois ce qui suit

[ 'my, tags are, in here' ]

Alors que je veux

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

4
tu ne veux pas dire espace ou virgule?
KaptajnKold

1
Pour expliquer le résultat que vous obtenez: "my, tags are, in here".split(" ,")ne divisera la chaîne que là où un espace suivi d'une virgule est le séparateur. Votre chaîne ne contient pas cette séquence, elle n'est donc pas fractionnée. "my, tags are, in here".split(", ")avec la séquence de fractionnement permutée, vous diviserez au moins votre chaîne d'origine en trois parties, après chaque virgule et espace. Si vous voulez cinq parties, les réponses ci-dessous spécifient la chaîne de correspondance sous forme d'expression régulière correspondant à un espace ou à une virgule.
Jochem Schulenklopper

Réponses:


233

String.split peut également accepter une expression régulière:

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

Cette expression régulière particulière se divise sur une séquence d'une ou plusieurs virgules ou espaces, de sorte que par exemple plusieurs espaces consécutifs ou une séquence virgule + espace ne produisent pas d'éléments vides dans les résultats.


22
Et quoi /,?\s+/?
Bergi

4
@Bergi: Eh bien, c'est à la fois plus strict que ce que je suggère (une seule virgule autorisée, devant) et plus lâche (divisé sur tous les espaces) que ce que l'OP a demandé. À mon humble avis, ce serait tout simplement pire - considérez l'entrée spaces , before commas.
Jon

@Jon: OK, cela dépend des besoins des OP. Je ne voudrais pas plenk :-)
Bergi

11
+1 Je sais que c'est un peu vieux mais pourquoi utiliser un espace vide et non \s. Je peux avoir des sauts de ligne dans le blob et je m'en \scharge aussi.
iambriansreed

6
REMARQUE FACEPALM: ne mettez pas de guillemets autour de l'expression régulière. par exemple, ne pas utiliser input.split("/[ ,]+/)". Laissez les citations ( input.split(//)au lieu de input.split("//")) et vous aurez une bien meilleure expérience. Parce que curieusement, cela ne fonctionnerait probablement que sur lui-même (pour générer ["input.split(\"", ")\""]).
cod3monk3y

41

La suggestion à utiliser .split(/[ ,]+/)est bonne, mais avec des phrases naturelles, tôt ou tard, vous finirez par avoir des éléments vides dans le tableau. par exemple ['foo', '', 'bar'].

Ce qui est bien si cela convient à votre cas d'utilisation. Mais si vous voulez vous débarrasser des éléments vides, vous pouvez faire:

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

6
C'est une utilisation très intelligente des constructeurs implicites d'objet natif - le clavier de mon ordinateur est fou ce matin - je modifierai ce commentaire plus tard - mais le point appelle Boolean comme 'Boolean ()' construira une nouvelle instance de [object Boolean] avec un valeur de false, tout comme invoquer 'new Boolean ()'. Cela filtrera toutes les correspondances jusqu'à ce comportement par défaut. Nice one :)
VLostBoy

qu'entendez-vous exactement par «phrases naturelles»? Je ne pouvais pas l'imiter et je ne comprends pas ce que cela est censé faire.
cregox

C'est expliqué par @VLostBoy. Lorsque le Boolean()constructeur est appelé sur une valeur, il convertit cette valeur en booléen - vrai ou faux. Ainsi, toutes les valeurs fausses seront filtrées du tableau, y compris les chaînes vides.
jonschlinkert

1
btw, vous pouvez utiliser des constructeurs implicites pour d'autres choses amusantes similaires, comme[1, 2, 3].map(String)
jonschlinkert

2
"foo, bar,,foobar,".split(/[\s,]+/)renvoie ["foo", "bar", "foobar", ""](à cause de la virgule pendante à la fin), merci!
Rafał Cieślak

37

vous pouvez utiliser regex pour capturer n'importe quelle longueur d'espace blanc, et ce serait comme:

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" 

Méfiez-vous des espaces de début / de fin lors de l'utilisation /\s+/. Par exemple 'a b c '.split(/\s+/) === [ 'a', 'b', 'c', '' ],. Si vous .trim()commencez par la chaîne, vous serez bon.
Jordan Dodson le

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

le résultat est :

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

4

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

\s* Correspond à zéro ou plusieurs caractères d'espace blanc (pas seulement des espaces, mais aussi des tabulations et des retours à la ligne).

... [\s,] correspond à un espace blanc ou à une virgule

Si vous voulez éviter les éléments vides de l'entrée comme "foo,bar,,foobar", cela fera l'affaire:

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

Le +correspond à un ou plusieurs des caractères ou groupes précédents.

Éditer:

Ajouté ?après la virgule qui correspond à zéro ou une virgule.

Modifier 2:

Il s'avère que l'édition 1 était une erreur. Corrigé. Il doit maintenant y avoir au moins une virgule ou un espace pour que l'expression trouve une correspondance.


Non. Ce n'est pas bon. Voici la sortie: ["my", "tags are", "in here"]
gabitzish

il semble se diviser sur chaque personnage.
Marco

@Marco Oups. J'aurais probablement dû le tester avant de faire cette dernière modification. Je l'ai maintenant, et cette fois, cela devrait vraiment fonctionner.
KaptajnKold

Hmm, en quoi est-ce mieux que la réponse acceptée? "foo,bar,foobar".split(/[ ,]+/)revient ["foo", "bar", "foobar"]aussi.
Rafał Cieślak

1
@KaptajnKold Oh, je n'ai pas compris ça, merci d'avoir répondu!
Rafał Cieślak

2

Lorsque je veux prendre en compte des caractères supplémentaires comme vos virgules (dans mon cas, chaque jeton peut être entré avec des guillemets), je ferais une string.replace () pour changer les autres délimiteurs en blancs, puis diviser sur un espace blanc.


1
str_variable.replace(/[,'"]+/gi, ' ').split(' ')
qräbnö le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.