我正在尝试拆分字符串以获取其中的字词。
我的代码如下:
def words(string)
string.downcase!
hash_str = Hash.new
string.split(/\W/i).each {|y|
if(hash_str.has_key?(y))
hash_str[y] += 1
else
hash_str[y] =1
end
}
return hash_str
end
hash_t = words("A man, a plan, a canal -- Panama")
hash_t.each{|x,y| puts "#{x}:#{y}"}
输出是:
1 :5
2 a:3
3 plan:1
4 man:1
5 canal:1
6 panama:1
我的问题是,似乎还在计算空白。 如何添加/ W空格?
谢谢。
答案 0 :(得分:3)
空白字符串条目将出现两个或多个非单词字符相邻的位置。
所以"A man, a"
在空格处分割,以提供"A"
和"man, a"
;然后在逗号处提供"man"
和" a"
,然后再在空格处提供""
和"a"
。
如果你使用split(/\W+/i)
,你会得到你所期望的,因为它会将每个非单词字符串视为一个单独的分割。
答案 1 :(得分:2)
在这种情况下,使用scan
在概念上更自然。这个用例的典型实现是:
def words(string)
Hash.new(0).tap{|h| string.downcase.scan(/\w+/){|w| h[w] += 1}}
end
words("A man, a plan, a canal -- Panama").each{|x,y| puts "#{x}:#{y}"}
会给出:
a:3
man:1
plan:1
canal:1
panama:1
答案 2 :(得分:1)
更多Ruby-ish解决方案:
str = "A man, a plan, a canal -- Panama"
str.downcase.split(/\W+/).inject(Hash.new(0)) { |h,v| h[v] += 1; h }
=> {"plan"=>1, "a"=>3, "panama"=>1, "man"=>1, "canal"=>1}