如何计算ruby中字符串的单词

时间:2011-06-21 11:07:14

标签: ruby

我想做这样的事情

def get_count(string)
 sentence.split(' ').count
end

我认为可能有更好的方法,字符串可能有内置方法来执行此操作。

9 个答案:

答案 0 :(得分:4)

我认为count是一个函数,所以你可能想要使用length。

def get_count(string) 
    sentence.split(' ').length
end

编辑:如果你的字符串真的很长,从中创建一个数组,任何拆分都需要更多的内存,所以这里有一个更快的方法:

def get_count(string) 
    (0..(string.length-1)).inject(1){|m,e| m += string[e].chr == ' ' ? 1 : 0 }
end

答案 1 :(得分:3)

如果唯一的单词边界是单个空格,只需计算它们。

puts "this sentence has five words".count(' ')+1 # => 5

如果单词之间有空格,行尾,制表符,逗号后跟空格等,则可能会扫描单词边界:

puts "this, is./tfour   words".scan(/\b/).size/2

答案 2 :(得分:1)

我知道这是一个老问题,但这可能有助于某人在这里磕磕绊绊。反对词是一个复杂的问题。什么是“字”?数字和特殊字符算作单词吗?等...

我为此目的编写了words_counted gem。它是一个高度灵活,可定制的字符串分析器。您可以要求它使用正则表达式,字符串和数组来分析字数统计,单词出现以及排除单词/字符的任何字符串。

counter = WordsCounted::Counter.new("Hello World!", exclude: "World")
counter.word_count #=> 1
counted.words      #=> ["Hello"]

等等...

documentation and full source are on Github

答案 3 :(得分:0)

使用正则表达式也将涵盖多个空格:

sentence.split(/\S+/).size

答案 4 :(得分:0)

String没有预先构建的任何内容来执行您想要的操作。您可以在类中定义方法,或者为您想要的内容扩展String类本身:

def word_count( string )
  return 0 if string.empty?

  string.split.size
end

答案 5 :(得分:0)

正则表达式拆分任何非单词字符:

string.split(/\W+/).size

...虽然它使得撇号使用计为两个单词,因此根据误差范围需要多小,您可能需要构建自己的正则表达式。

答案 6 :(得分:0)

我最近发现String#count比用over an order of magnitude分割字符串要快。

不幸的是,String#count只接受一个字符串,而不是正则表达式。此外,它将两个相邻的空间计为两件事,而不是一件事,你必须单独处理其他空白字符。

答案 7 :(得分:0)

p "  some word\nother\tword.word|word".strip.split(/\s+/).size #=> 4

答案 8 :(得分:0)

我宁愿直接检查单词边界:

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

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

"Lorem Lorem Lorem rock-and-roll".scan(/[\w-]+/).size
=> 4