2

用下面的表达式:

words = string.scan(/\b\S+\b/i)

我正在尝试使用单词边界和不区分大小写来扫描字符串,所以如果我有:

string = "A ball a Ball" 

然后当我有这个each块时:

words.each { |word| result[word] += 1 }

我期待这样的事情:

{"a"=>2, "ball"=>2}

但相反,我得到的是:

{"A"=>1, "ball"=>1, "a"=>1, "Ball"=>1}

在这件事不起作用之后,我尝试创建一个新的正则表达式,例如:

Regexp.new(Regexp.escape(string), "i")

但后来我不知道如何使用它从这里继续前进。

4

2 回答 2

4

正则表达式以不区分大小写的模式匹配单词,但它不会以任何方式更改匹配的文本。因此,您将在块中收到原始形式的文本。计数时尝试将字符串转换为小写。

string = "A ball a Ball" 
words = string.scan(/\b\S+\b/i) # => ["A", "ball", "a", "Ball"]

result = Hash.new(0)
words.each { |word| result[word.downcase] += 1 } 
result # => {"a"=>2, "ball"=>2}
于 2012-10-08T15:46:12.533 回答
2

正则表达式很好;您的问题是当您使用哈希增加计数器时。哈希键区分大小写,因此在递增时必须更改大小写:

words.each { |word| result[word.upcase] += 1 } 
于 2012-10-08T15:46:54.553 回答