Подтвердить что ты не робот

Лучший способ подсчета слов в строке в Ruby?

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

4b9b3361

Ответ 1

string.split.size

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

На странице страница Ruby String

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

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

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

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

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

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

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

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

Ответ 2

Я знаю, что это старый вопрос, но это может быть полезно для кого-то другого, ищущего что-то более сложное, чем 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"]

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

Ответ 3

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


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

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

Ответ 4

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

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"

Ответ 5

Вышеупомянутое решение неверно, рассмотрите следующее:

"one-way  street"

Вы получите

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

Использование

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

Ответ 6

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

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

Ответ 7

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

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

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