Encontrando # ocorrências de um caractere em uma string em Ruby

103

Estou procurando o método Ruby (1.9 ...) que pode me ajudar a encontrar o número de ocorrências de um caractere em uma string. Procuro todas as ocorrências, não apenas a primeira.

Por exemplo: "Melanie é noob" Existem duas ocorrências da letra 'a'. Qual seria o método Ruby que eu poderia usar para encontrar isso?

Tenho usado Ruby-doc.org como referência e o scanmétodo String: classchamou minha atenção. A formulação é um pouco difícil para mim entender, então eu realmente não entendo o conceito de scan.

Edit: Consegui resolver isso usando scan. Compartilhei em um vídeo como consegui isso.

Melanie
fonte
2
Você quer o número de ocorrências ou os valores de índice das ocorrências na string? Saber quantas vezes é útil, mas normalmente a próxima pergunta é "onde estão?"
o Tin Man de

Respostas:

143

Se você quiser apenas o número de a's:

puts "Melanie is a noob".count('a')  #=> 2

Docs para mais detalhes.

Steenslag
fonte
18
Eu realmente gostei dessa resposta até que percebi que você apenas pegou a string da pergunta :-) Ainda assim, +1.
Hubro
porque não funciona com pontos? Exemplo "voyage.localhost.com" .count ('www.') => 2. Como pode ser isso?
Gediminas
12
@Gediminas countconta caracteres, não strings. "voyage.localhost.com" .count ('www.') é o mesmo que "voyage.localhost.com" .count ('w.') e como não há w's e dois pontos, o resultado é 2.
steenslag
2
Alguma chance de você adicionar um link para os documentos ?
Processo de Fundo Monica
2
Fiquei inicialmente bastante chocado com esta resposta, mas depois vi que Melanie usou o exemplo primeiro. Boa resposta!
AJFaraday
52

Este link de uma pergunta feita anteriormente deve ajudar a escanear uma string em Ruby

scan retorna todas as ocorrências de uma string em uma string como um array, então

"Melanie is a noob".scan(/a/)

retornará

["a","a"]
Shiv
fonte
1
Esta é a resposta que eu procurava :)
Zippie,
3
scanfunciona com Strings simples também, então scan('a')pode ser usado também
Daniel Rikowski,
1

Consegui resolver isso passando uma corda por scan conforme mostrado em outra resposta.

Por exemplo:

string = 'This is an example'
puts string.count('e')

Saídas:

2

Também consegui extrair as ocorrências usando scan e passando um sting em vez de regex, o que varia ligeiramente de outra resposta, mas foi útil para evitar regex.

string = 'This is an example'
puts string.scan('e')

Saídas:

['e','e']

Eu explorei esses métodos ainda mais em um pequeno guia de vídeo que criei depois que descobri.

Melanie
fonte