10
votes

Comment puis-je diviser la chaîne en matrice de plusieurs mots?

J'ai une chaîne que j'utilise .split ('') sur pour diviser la chaîne en une gamme de mots. Puis-je utiliser une méthode similaire pour diviser la chaîne en une matrice de 2 mots à la place?

retourne un tableau où chaque élément est un mot: xxx

Je cherche à retourner un tableau où chaque élément est 2 mots.


3 commentaires

Comment voulez-vous traiter un nombre impair de mots? Déposer le dernier mot? Déposer le premier mot? Garde le?


duplicaté possible de Needez-vous Sub Tableaux de taille spécifiée dans Ruby


Markthomas avez-vous même lu la question


5 Réponses :


3
votes

Quelque chose comme ça devrait fonctionner: xxx


7 commentaires

str = 'one1! Two2 @ Three3 # Four4 Five4 $ cinq6 ^ ' sorties [] . Je ne sais pas si les mots sont tous alphabétiques


Peut-être que string.scan (/ \ s + \ s + /) serait mieux.


Il est également sans réponse à savoir comment marcher un nombre impair de mots. Je ne sais pas.


Probablement / \ s + \ s + \ s + / parce que vous ne savez pas nécessairement que c'est un espace entre les mots.


OP ne répond pas, il se pourrait qu'ils veulent littéralement diviser sur des espaces. Qui sait ... Je ne passe plus de temps à ce sujet.


Ceci échoue le simple test de 'A b C'.Scan (/ \ w + \ w + /) => ["A B"]


Il est sans réponse Comment traiter un nombre impair de mots.



7
votes
str = 'one two three four five six seven'
str.split.each_slice(2).map{|a|a.join ' '}
=> ["one two", "three four", "five six", "seven"]
This also handles the case of an odd number of words.

3 commentaires

J'essaie de comprendre comment je peux réduire cela à quelque chose comme str.split.each_slice (2) .map (&: rejoindre) mais je ne peux pas obtenir le '' < / code> argument sur le rejoindre .


Joe: Il vaut mieux ouvrir une question distincte. Astuce: non &: Mais à la place inline {| t | t.join ('')}


Merci pour le commentaire @simonb. Mais le commentaire était surtout mon propre commentaire à moi-même sur ma propre réponse. La réponse reflète déjà votre indice, j'essayais de faire plus de terrains.



4
votes

Vous pouvez faire

string= 'one1! two2@ three3# four4$ five5% six6^ sev'
string.scan(/\S+ ?\S*/)
# => ["one1! two2@", "three3# four4$", "five5% six6^", "sev"]


4 commentaires

Pas si le dernier mot est un seul caractère.


Est-ce que vous remplacez le `?` avec \ s * , il conservera également l'espacement d'origine entre les mots.


@Joshuacheek désolé je ne comprends pas. Qu'entendez-vous par le blanchiment d'origine?


@Oldergod si c'était "one1! \ t deux2 @" , cela conserverait l'onglet et les espaces supplémentaires (l'affichage d'un espace de l'exemple n'existait que de nombreux)



2
votes

's Scan CODE> est utile pour cela:

'a b c'.scan(/\w+(?:\s+\w+)?/)
=> ["a b", "c"]

'a b c d e f g'.scan(/\w+(?:\s+\w+)?/)
=> ["a b", "c d", "e f", "g"]


0 commentaires

2
votes

C'est tout ce que je devais faire: xxx


0 commentaires