使用以下表达式:
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,如:
Regexp.new(Regexp.escape(string), "i")
但后来我不知道如何使用此或从这里继续前进。
答案 0 :(得分: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 :(得分:2)
正则表达式很好;你的问题是当你使用哈希增加你的计数器。散列键区分大小写,因此您必须在递增时更改大小写:
words.each { |word| result[word.upcase] += 1 }