为什么在使用/ W分割字符串时会产生空格

时间:2013-01-24 10:03:37

标签: ruby

我正在尝试拆分字符串以获取其中的字词。

我的代码如下:

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空格?

谢谢。

3 个答案:

答案 0 :(得分:3)

空白字符串条目将出现两个或多个非单词字符相邻的位置。

所以"A man, a"在空格处分割,以提供"A""man, a";然后在逗号处提供"man"" a",然后再在空格处提供"""a"

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

Codepad link

答案 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}