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 に答える