2009-09-12 28 views

risposta

44
string.split.size 

A cura di allontanare l'onda di marea di stupidità per quanto riguarda gli spazi multipli

Dal Ruby String Documentation page

split (pattern = $ ;, [limite]) → anArray

Divide str in sottostringhe in base a un delimitatore, restituendo un array di questi substrin gs.

Se pattern è una stringa, il suo contenuto viene utilizzato come delimitatore durante la divisione di str. Se pattern è un singolo spazio, str è diviso nello spazio bianco , con spazi bianchi iniziali e run di spazi contigui caratteri ignorati.

Se pattern è un Regexp, str è diviso in cui il modello corrisponde. Ogni volta che il modello corrisponde a una stringa di lunghezza zero, str viene suddiviso in caratteri singoli. Se pattern contiene gruppi, le rispettive corrispondenze verranno restituite anche nell'array.

Se il modello è omesso, il valore di $; si usa. Se $; è nil (che è di default), str è diviso in spazi bianchi come se fosse stato specificato "".

Se il parametro limite è omesso, i campi null finali sono soppressi. Se il limite è un numero positivo, al massimo verrà restituito il numero di campi (se il limite è 1, l'intera stringa viene restituita come unica voce in un array). Se negativo, non vi è alcun limite al numero di campi restituiti e i campi null finali non sono soppressi.

" now's the time".split  #=> ["now's", "the", "time"] 

Anche se questo è l'attuale versione di Ruby come di questa modifica, ho imparato a 1.7 (IIRC), dove che anche lavorato. L'ho appena testato su 1.8.3.

+0

Anche questa anima conta gli spazi come parole (vuote), considera quello. –

+0

@DavidMauricio No non lo farà. 'split' senza un argomento predefinito per dividere su spazi vuoti. (Beh, si dividerà su '$;', ma se anche questo è 'nil', allora si dividerà su spazi vuoti.) I documenti di Ruby descrivono questo comportamento come" con gli spazi bianchi e le sequenze di caratteri contigui dello spazio bianco ignorati ". – KitsuneYMG

+1

Non creerebbe inutilmente l'array di parole solo per restituirne la dimensione? Cosa succede se ci sono 10.000 parole in un testo? Ciò perderebbe spazio e sarebbe più lento a causa di ciò. – Ernesto

2

Se la "parola" in questo caso può essere descritta come una sequenza alfanumerica che può includere "-", la seguente soluzione può essere appropriata (presupponendo che tutto ciò che non corrisponde al modello "parola" sia un separatore) :

 

>> 'one-way street'.split(/[^-a-zA-Z]/).size 
=> 2 
>> 'one-way street'.split(/[^-a-zA-Z]/).each { |m| puts m } 
one-way 
street 
=> ["one-way", "street"] 
 

Tuttavia, ci sono alcuni altri simboli che possono essere inclusi nella regex - per esempio, 'per sostenere le parole come 'è'.

0

La soluzione di cui sopra è sbagliato, considerare quanto segue:

"one-way street" 

Otterrete

["one-way","", "street"] 

Usa

'one-way street'.gsub(/[^-a-zA-Z]/, ' ').split.size 
+1

[tra una strada e una via, ci sono 2 spazi] – Hillel

+7

No. Ruby si dividerà su spazi bianchi (gli spazi bianchi contigui e iniziali/finali vengono ignorati, ad esempio '\ s +') se non viene fornito alcun argomento e '$;' è 'nil'. Per favore impara il rubino. – KitsuneYMG

0

Questo divide le parole solo su ASCII caratteri spazi bianchi:

p " some word\nother\tword|word".strip.split(/\s+/).size #=> 4 
9

So che questa è una vecchia domanda, ma potrebbe essere utile a qualcun altro che cerca qualcosa di più sofisticato di string.split. Ho scritto la gemma words_counted per risolvere questo particolare problema, dal momento che definire le parole è piuttosto complicato.

La gemma consente di definire i propri criteri personalizzati, o di usare la regexp out of the box, che è molto utile per la maggior parte dei casi d'uso. Puoi pre-filtrare le parole con una varietà di opzioni, tra cui una stringa, lambda, array o un'altra espressione regolare.

counter = WordsCounted::Counter.new("Hello, Renée! 123") 
counter.word_count #=> 2 
counter.words #=> ["Hello", "Renée"] 

# filter the word "hello" 
counter = WordsCounted::Counter.new("Hello, Renée!", reject: "Hello") 
counter.word_count #=> 1 
counter.words #=> ["Renée"] 

# Count numbers only 
counter = WordsCounted::Counter.new("Hello, Renée! 123", rexexp: /[0-9]/) 
counter.word_count #=> 1 
counter.words #=> ["123"] 

La gemma fornisce uno bunch more useful methods.

+1

gemma eccellente, proprio quello che stavo cercando, grazie –

1

Questo è piuttosto semplicistico, ma fa il lavoro se si digitano le parole con gli spazi in mezzo. Finisce per contare anche i numeri, ma sono sicuro che potresti modificare il codice per non contare i numeri.

puts "enter a sentence to find its word length: " 
word = gets 
word = word.chomp 
splits = word.split(" ") 
target = splits.length.to_s 


puts "your sentence is " + target + " words long" 
0

Il modo migliore per farlo è quello di utilizzare dividere metodo. split divide una stringa in sottostringa basata su un delimitatore, restituendo un array delle sottostringhe. split accetta due parametri, vale a dire; modello e limite. modello è il delimitatore su cui la stringa deve essere suddivisa in una matrice. limite specifica il numero di elementi nell'array risultante. Per ulteriori dettagli, si riferiscono a rubino documentazione: Ruby String documentation

str = "This is a string" 
str.split(' ').size 
#output: 4 

Il codice sopra divide la stringa ovunque si trova un spazio e, quindi, invia il numero di parole nella stringa che è indirettamente la dimensione del array.

Problemi correlati