我想做这样的事情
def get_count(string)
sentence.split(' ').count
end
我认为可能有更好的方法,字符串可能有内置方法来执行此操作。
答案 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"]
等等...
答案 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