Je veux diviser une chaîne en supprimant tous les champs nullÉclate une chaîne supprimant tous les champs null
Commande:
",1,2,,3,4,,".split(',')
Résultat:
["", "1", "2", "", "3", "4", ""]
attendu:
["1", "2", "3", "4"]
Comment faire ça?
Modifier
Ok. Juste pour résumer toutes ces bonnes questions postées. Ce que je voulais, c'est que la méthode split (ou autre méthode) ne génère pas de chaînes vides. On dirait que ce n'est pas possible. Donc, la solution est un processus en deux étapes: séparer la chaîne comme d'habitude, puis supprimer les chaînes vides du tableau résultant.
La deuxième partie est exactement this question (et son duplicate)
donc j'utiliser
",1,2,,3,4,,".split(',').delete_if(&:empty?)
La solution proposée par Nikita Rybak et par user229426 est d'utiliser la méthode de rejet. Selon docs rejeter renvoie un nouveau tableau. Alors que la méthode delete_if est plus efficace car je ne veux pas de copie. En utilisant select proposé par Mark Byers encore plus inefficace.
steenslag propose de remplacer des virgules avec l'espace, puis utilisez l'espace divisé par:
",1,2,,3,4,,".gsub(',', ' ').split(' ')
En fait, the documentation dit que l'espace est en fait un espace blanc. Mais les résultats de "split (/ \ s /)" et "split ('')" ne sont pas les mêmes. Pourquoi ça? Mark Byers a proposé une autre solution - en utilisant simplement des expressions régulières. On dirait que c'est ce dont j'ai besoin. Mais cette solution implique que vous devez être maître de l'expression rationnelle. Mais c'est une excellente solution! Par exemple, si j'ai besoin des espaces pour être séparateurs, ainsi que tout symbole non alphanumérique je peux réécrire cela
",1,2, ,3 3,4 4 4,,".scan(/\w+[\s*\w*]*/)
le résultat est:
["1", "2", "3 3", "4 4 4"]
Mais encore une fois regexps sont très unintuitive et ils ont besoin une expérience.
Résumé
Je pense que scission de travailler avec comme si les espaces blancs étaient une virgule des espaces blancs ou même regexp. Je m'attends à ce qu'il ne produise pas de chaînes vides. Je pense que c'est un bug dans ruby ou mon malentendu.
En fait une question de la communauté.
Pas un expert rubis, mais semble http://stackoverflow.com/questions/3774509/eliminating-nil-lines est la même question plus ou moins, où vous mappez ma suppression sur la matrice, parler de timing. – Novikov
Oui, c'est le cas. Merci – Vanuan
Il est étrange pour moi aussi qu'une chaîne vide ('" "') soit renvoyée lorsque deux valeurs ne correspondent pas à l'expression rationnelle dans une ligne. – NotAnAmbiTurner