Разбить строку на несколько разделителей - PullRequest
0 голосов
/ 07 января 2019

Я хочу разбить строку по пробелам, запятым и точкам. Учитывая этот вход:

"hello this is a hello, allright this is a hello."

Я хочу вывести:

hello 3
a 2
is 2
this 2
allright 1

Я пытался:

puts "Enter string "
text=gets.chomp
frequencies=Hash.new(0)
delimiters = [',', ' ', "."]
words = text.split(Regexp.union(delimiters))
words.each { |word| frequencies[word] +=1}
frequencies=frequencies.sort_by {|a,b| b}
frequencies.reverse!
frequencies.each { |wor,freq| puts "#{wor} #{freq}"}

Это выводит:

hello 3
a 2
is 2
this 2
allright 1
 1

Я не хочу последнюю строку вывода. Это рассматривает пространство как слово тоже. Это может быть связано с наличием последовательных разделителей (,, &, " ").

1 Ответ

0 голосов
/ 07 января 2019

Используйте регулярное выражение:

str = 'hello this is a hello, allright this is a hello.'
str.split(/[.,\s]+/)
# => ["hello", "this", "is", "a", "hello", "allright", "this", "is", "a", "hello"]

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

Стоп и запятая говорят сами за себя, а \s относится к пробелу. + означает, что мы сопоставляем один или несколько из них, и означает, что мы избегаем пустых строк в случае 2+ из этих символов в последовательности.

Вам может пригодиться объяснение, предоставленное Regex101, которое можно найти здесь: https://regex101.com/r/r4M7KQ/3.


Редактировать: для бонусных баллов, вот хороший способ подсчитать количество слов, используя each_with_object:)

str.split(/[.,\s]+/).each_with_object(Hash.new(0)) { |word, counter| counter[word] += 1 }
# => {"hello"=>3, "this"=>2, "is"=>2, "a"=>2, "allright"=>1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...