正则表达式和字符串

时间:2012-10-08 15:42:02

标签: ruby regex

使用以下表达式:

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")

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

2 个答案:

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