0

我正在尝试拆分一个字符串以获取上面的单词..

我的代码如下:

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 中添加空格?

谢谢你。

4

3 回答 3

3

空白字符串条目出现在两个或多个非单词字符相邻的地方。

所以"A man, a"在空间分裂给"A""man, a"; 然后在逗号处给出"man"and " a",然后在空格处再次给出""and "a"

如果您使用split(/\W+/i),您会得到您所期望的,因为它将每个非单词字符字符串视为一个拆分。

键盘链接

于 2013-01-24T10:13:54.773 回答
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
于 2013-01-24T10:32:43.387 回答
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}
于 2013-01-24T10:20:16.363 回答