17

TitleとBodyのブログモデルがあるとします。本文の単語数とタイトルの文字数を表示するにはどうすればよいですか?このような出力にしたい

タイトル:Lorem本文:Lorem Lorem Lorem

この投稿の単語数は3です。

4

6 に答える 6

37
"Lorem Lorem Lorem".scan(/\w+/).size
=> 3

更新:ロックンロールを1つの単語として一致させる必要がある場合は、次のようにすることができます

"Lorem Lorem Lorem rock-and-roll".scan(/[\w-]+/).size
=> 4
于 2010-01-21T07:46:46.907 に答える
20

また:

"Lorem Lorem Lorem".split.size
=> 3
于 2010-01-21T09:08:41.560 に答える
5

パフォーマンスに興味がある場合は、簡単なベンチマークを作成しました。

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)

つまり、squishVeryLargeStrings™では低速です。それ以外splitは高速です(使用していない場合は2倍高速ですsquish)。

于 2014-01-08T23:13:03.607 に答える
3

ここでの答えにはいくつかの問題があります。

  1. utfおよびunicode文字(発音区別符号)は考慮されません:áâãêüなど...
  2. それらはアポストロフィとハイフンを考慮していません。したがって、2つの単語とJoe's見なされますが、これは明らかに正しくありません。のように、これは単一の複合語です。Joe'stwenty-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.
于 2014-04-30T21:25:35.520 に答える
2
"Lorem Lorem Lorem".scan(/\S+/).size
=> 3
于 2010-01-21T10:21:44.057 に答える
2
"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
于 2014-07-01T19:48:04.867 に答える