Лучший способ считать слова в строке в Ruby? - PullRequest
23 голосов
/ 13 сентября 2009

Есть ли что-нибудь лучше, чем string.scan(/(\w|-)+/).size (- так, например, "улица с односторонним движением" считается как 2 слова вместо 3)?

Ответы [ 7 ]

49 голосов
/ 13 сентября 2009
string.split.size

Отредактировано, чтобы предотвратить приливную глупость в отношении нескольких пространств

Со страницы документации Ruby String

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

Делит str на подстроки на основе разделителя, возвращая массив из этих подстрок.

Если шаблон является строкой, то его содержимое используется в качестве разделителя при разделении ул. Если шаблон представляет собой один пробел, строка разбивается на пробелы, с ведущими пробелами и последовательными пробелами символы игнорируются.

Если шаблон является регулярным выражением, str делится там, где шаблон соответствует. Всякий раз, когда шаблон соответствует строке нулевой длины, строка разбивается на отдельные персонажи. Если шаблон содержит группы, соответствующие совпадения также будут возвращены в массиве.

Если шаблон не указан, значение $; используется. Если $; ноль (что по умолчанию), str разделяется на пробелы, как если бы было указано ''.

Если параметр limit пропущен, завершающие нулевые поля подавлено. Если предел является положительным числом, самое большее это число поля будут возвращены (если предел равен 1, возвращается вся строка как единственная запись в массиве). Если отрицательный, нет предела количество возвращаемых полей, а завершающие нулевые поля не подавлено.

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

Хотя это текущая версия ruby ​​на момент этого редактирования, я узнал о 1.7 (IIRC), где это тоже сработало. Я только что проверил это на 1.8.3.

11 голосов
/ 27 мая 2014

Я знаю, что это старый вопрос, но он может быть полезен для кого-то, кто ищет что-то более сложное, чем string.split. Я написал гем words_counted, чтобы решить эту конкретную проблему, поскольку определение слов довольно сложно.

Драгоценный камень позволяет вам определять свои собственные критерии или использовать готовое регулярное выражение, что довольно удобно для большинства случаев использования. Вы можете предварительно фильтровать слова с различными вариантами, включая строку, лямбду, массив или другое регулярное выражение.

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"]

Драгоценный камень предоставляет кучу более полезных методов .

2 голосов
/ 16 сентября 2009

Если «слово» в этом случае может быть описано как буквенно-цифровая последовательность, которая может включать «-», тогда может быть целесообразным следующее решение (при условии, что все, что не соответствует шаблону «слова», является разделителем):


>> '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"]

Однако, есть некоторые другие символы, которые могут быть включены в регулярное выражение - например, «для поддержки таких слов, как« это ».

1 голос
/ 29 мая 2017

Лучший способ сделать это - использовать метод split . split делит строку на подстроки на основе разделителя, возвращая массив подстрок. split принимает два параметра, а именно; шаблон и предел . pattern - это разделитель, по которому строка должна быть разбита на массив. limit указывает количество элементов в результирующем массиве. Для получения более подробной информации см. Документацию по Ruby: Документация по Ruby String

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

Приведенный выше код разбивает строку везде, где он находит пробел , и, следовательно, он дает количество слов в строке, которое косвенно размер массива.

1 голос
/ 31 мая 2015

Это довольно упрощенно, но работает, если вы печатаете слова с пробелами между ними. Это также приводит к подсчету чисел, но я уверен, что вы можете изменить код, чтобы не считать числа.

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 голосов
/ 15 октября 2011

Это разбивает слова только на пробельные символы ASCII:

p "  some word\nother\tword|word".strip.split(/\s+/).size #=> 4
0 голосов
/ 14 августа 2011

Приведенное выше решение неверно, учтите следующее:

"one-way  street"

Вы получите

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

Используйте

'one-way street'.gsub(/[^-a-zA-Z]/, ' ').split.size
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...