2012-10-08 136 views
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

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

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} 
+1

或者对输入字符串执行一次'.downcase'并完成它。应该快一点吧? –

+0

@TimPietzcker:或者说,是啊:) –

2

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

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