17

假设我有一个带有标题和正文的博客模型。我如何显示正文中的单词数和标题中的字符数?我希望输出是这样的

标题: Lorem 身体: Lorem Lorem Lorem

这篇文章的字数为 3。

4

6 回答 6

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

更新:如果您需要将摇滚乐作为一个词匹配,您可以这样做

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

换句话说,squishVery Large Strings™ 很慢。除此之外,split速度更快(如果您不使用,速度会提高一倍squish)。

于 2014-01-08T23:13:03.607 回答
3

这里的答案有几个问题:

  1. 他们不考虑 utf 和 unicode 字符(变音符号):áâãêü 等...
  2. 他们不考虑撇号和连字符。所以Joe's会被认为是两个词Joe's这显然是不正确的。As will twenty-two,这是一个复合词。

像这样的东西效果更好,并解决了这些问题:

foo.scan(/[\p{Alpha}\-']+/)

你可能想看看我的Words Counted gem。它允许计算单词、它们的出现次数、长度和其他一些东西。它也有很好的记录。

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
"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 回答
2
"Lorem Lorem Lorem".scan(/\S+/).size
=> 3
于 2010-01-21T10:21:44.057 回答