2012-10-08 133 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 }