147 votes

Comment diviser une chaîne de caractères par un espace blanc ou une virgule ?

Si j'essaie

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

J'obtiens ce qui suit

[ 'my, tags are, in here' ]

Alors que je veux

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

4 votes

Vous ne voulez pas dire "espace blanc" ? ou virgule ?

1 votes

Pour expliquer le résultat que vous obtenez : "my, tags are, in here".split(" ,") ne scindera la chaîne qu'à l'endroit où un espace suivi par une virgule est le séparateur. Votre chaîne ne contient pas cette séquence, elle n'est donc pas divisée. "my, tags are, in here".split(", ") en intervertissant la séquence de découpage, divisera au moins votre chaîne originale en trois parties, après chaque virgule et chaque espace. Si vous voulez cinq parties, les réponses ci-dessous spécifient la chaîne de correspondance comme une expression régulière correspondant à un espace ou une virgule.

295voto

Jon Points 194296

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

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

Cette expression rationnelle particulière s'applique à 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.

4 votes

@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 (séparation de tous les espaces blancs) que ce que l'OP a demandé. IMHO, ce serait tout simplement pire - considérez l'entrée spaces , before commas .

0 votes

@Jon : OK, cela dépend des besoins de l'OP. Je ne ferais pas de plenk :-)

15 votes

+1 Je sais que c'est un peu vieux, mais pourquoi utiliser un espace vide et non pas \s . Il se peut que des sauts de ligne soient présents dans le blob et le \s s'en occupe également.

56voto

Cemil Dogan Points 847

Vous pouvez utiliser des expressions rationnelles pour capturer n'importe quelle longueur d'espace blanc :

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"

7 votes

Attention aux espaces blancs de début et de fin lors de l'utilisation de /\s+/ . Par exemple, 'a b c '.split(/\s+/) === [ 'a', 'b', 'c', '' ] . Si vous .trim() la corde en premier, tout ira bien.

46voto

jonschlinkert Points 3511

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

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

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

6 votes

C'est une utilisation très intelligente des constructeurs implicites d'objets natifs - le clavier de mon ordinateur est fou ce matin - j'éditerai ce commentaire plus tard - mais le fait est qu'invoquer Boolean comme 'Boolean()' construira une nouvelle instance de [objet Boolean] avec une valeur de false, tout comme le ferait invoquer 'new Boolean()'. Cela permettra de filtrer toutes les correspondances jusqu'à ce comportement par défaut. Bien joué :)

0 votes

Qu'entendez-vous exactement par "phrases naturelles" ? Je n'ai pas pu l'émuler et je ne comprends pas ce que c'est censé faire.

1 votes

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

12voto

gabitzish Points 5056
"my, tags are, in here".split(/[ ,]+/)

le résultat est :

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

10voto

KaptajnKold Points 2684

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

\s* correspond à zéro ou plusieurs caractères d'espacement (non seulement les espaces, mais aussi les tabulations et les nouvelles lignes).

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

0 votes

Nop. Ce n'est pas bon. Voici le résultat : ["my", "tags are", "in here"]

0 votes

Il semble se diviser sur chaque personnage.

0 votes

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X