2010-08-25 6 views
2

J'ai une chaîne et je veux en extraire une autre qui n'a que des caractères à des positions occurantes.Comment obtenir du texte dans une chaîne en Ruby

Par exemple, si j'ai une chaîne appelée ABCDEFGH, la sortie attendue est ACEG puisque les index de caractères sont respectivement à 0,2,4,6. Je l'ai fait en utilisant une boucle, mais il devrait y avoir une implémentation en ligne dans Ruby (peut-être en utilisant Regex?).

+0

Je dois dire que ça ressemble énormément à une question de devoirs: P De toute façon, je ne sais pas trop Ruby pour t'aider, mais tu ne devrais pas poster à quelle distance tu as eu au lieu de simplement demander une fonction comme ça? – Jasper

+0

Je ne suis pas sûr de ce que vous demandez ici. Vous essayez d'obtenir les index dans une chaîne de caractères dans un autre? Est-ce que cette fonction devrait revenir? – Chuck

+0

@Jasper: aw .. c'est une implémentation simple (que j'ai déjà fait, mais ça a l'air très long). Je suis très sûr que les gens de Ruby ont sûrement une implémentation de ligne. – bragboy

Répondre

2

Voici la solution d'une ligne:

"BLAHBLAH".split('').enum_for(:each_with_index).find_all { |c, i| i % 2 == 0 }.collect(&:first).join 

Ou:

''.tap do |res| 
    'BLAHBLAH'.split('').each_with_index do |char, index| 
    res << c if i % 2 == 0 
    end 
end 

Une variante plus:

"BLAHBLAH".split('').enum_slice(2).collect(&:first).join 
1

Pas sûr de la vitesse de l'exécution, mais il est une ligne de traitement.

res = ""; 
"BLAHBLAH".scan(/(.)(.)/) {|a,b| res += a} 
res # "BABA" 
+1

Pourquoi ne pas juste '" BLAHBLAH ".scan (/(.)./). Map (&: first). rejoindre »? Ne pas besoin d'un accumulateur ou deux captures – guns

+0

hein hein, il a dit "(.) (.)" – steenslag

+0

belle solution @guns –

1
(0..string.length).each_with_index { |x,i| puts string[x] if i%2 != 0 } 
+0

Attention. Ruby1.9 chaînes ne sont pas énumérables – guns

2

D'autres façons:

Utilisation Enumerable méthodes

"BLAHBLAHBLAH".each_char.each_slice(2).map(&:first).join 

En utilisant regular expressions:

"BLAHBLAHBLAH".scan(/(.).?/).join 
3
>> "ABCDEFGH".gsub /(.)./,'\1' 
=> "ACEG" 
+0

ressemble à un gsub simple est le meilleur de la fin – guns

Questions connexes