TitleとBodyのブログモデルがあるとします。本文の単語数とタイトルの文字数を表示するにはどうすればよいですか?このような出力にしたい
タイトル:Lorem本文:Lorem Lorem Lorem
この投稿の単語数は3です。
TitleとBodyのブログモデルがあるとします。本文の単語数とタイトルの文字数を表示するにはどうすればよいですか?このような出力にしたい
タイトル:Lorem本文:Lorem Lorem Lorem
この投稿の単語数は3です。
"Lorem Lorem Lorem".scan(/\w+/).size
=> 3
更新:ロックンロールを1つの単語として一致させる必要がある場合は、次のようにすることができます
"Lorem Lorem Lorem rock-and-roll".scan(/[\w-]+/).size
=> 4
また:
"Lorem Lorem Lorem".split.size
=> 3
パフォーマンスに興味がある場合は、簡単なベンチマークを作成しました。
require 'benchmark'
require 'bigdecimal/math'
require 'active_support/core_ext/string/filters'
# Where "shakespeare" is the full text of The Complete Works of William Shakespeare...
puts 'Benchmarking shakespeare.scan(/\w+/).size x50'
puts Benchmark.measure { 50.times { shakespeare.scan(/\w+/).size } }
puts 'Benchmarking shakespeare.squish.scan(/\w+/).size x50'
puts Benchmark.measure { 50.times { shakespeare.squish.scan(/\w+/).size } }
puts 'Benchmarking shakespeare.split.size x50'
puts Benchmark.measure { 50.times { shakespeare.split.size } }
puts 'Benchmarking shakespeare.squish.split.size x50'
puts Benchmark.measure { 50.times { shakespeare.squish.split.size } }
結果:
Benchmarking shakespeare.scan(/\w+/).size x50
13.980000 0.240000 14.220000 ( 14.234612)
Benchmarking shakespeare.squish.scan(/\w+/).size x50
40.850000 0.270000 41.120000 ( 41.109643)
Benchmarking shakespeare.split.size x50
5.820000 0.210000 6.030000 ( 6.028998)
Benchmarking shakespeare.squish.split.size x50
31.000000 0.260000 31.260000 ( 31.268706)
つまり、squish
VeryLargeStrings™では低速です。それ以外split
は高速です(使用していない場合は2倍高速ですsquish
)。
ここでの答えにはいくつかの問題があります。
Joe's
見なされますが、これは明らかに正しくありません。のように、これは単一の複合語です。Joe
's
twenty-two
このようなものの方がうまく機能し、これらの問題を説明します。
foo.scan(/[\p{Alpha}\-']+/)
あなたは私のWordsCountedgemを見たいかもしれません。それは単語、それらの出現、長さ、および他のいくつかのものを数えることを可能にします。また、非常によく文書化されています。
counter = WordsCounted::Counter.new(post.body)
counter.word_count #=> 3
counter.most_occuring_words #=> [["lorem", 3]]
# This also takes into capitalisation into account.
# So `Hello` and `hello` are counted as the same word.
"Lorem Lorem Lorem".scan(/\S+/).size
=> 3
"caçapão adipisicing elit".scan(/[\w-]+/).size
=> 5
しかし、ご覧のとおり、この文には3つの単語しかありません。正規表現\wはアクセント付き文字を単語文字[A-Za-z0-9_]と見なさないため、この問題はアクセント付き文字に関連しています。
改善された解決策は
I18n.transliterate("caçapão adipisicing elit").scan(/[\w-]+/).size
=> 3