用多个定界符分割字符串

时间:2019-01-07 16:26:42

标签: ruby

我想用空格,逗号和点分隔字符串。鉴于此输入:

public class MyEntity {

@Id
@Column
private int myId;
private int anotherData;

... (getters and setters) ...

}

我要输出:

"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 :(得分:7)

使用正则表达式:

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

这使您可以通过请求的三个定界符中的任意一个来分割字符串。

stop和逗号是不言自明的,\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}