在Ruby中计算字符串中单词的最佳方法?

时间:2009-09-12 20:27:50

标签: ruby-on-rails ruby

有什么比string.scan(/(\w|-)+/).size更好(-是这样的,例如,“单行道”算作2个单词而不是3个单词?)

7 个答案:

答案 0 :(得分:49)

string.split.size

编辑以避免多个空间的愚蠢浪潮

来自Ruby String Documentation page

  

split(pattern = $;,[limit])→anArray

     

根据分隔符将str分为子串,返回一个数组   这些子串。

     

如果pattern是String,则其内容将用作分隔符   分裂str时如果pattern是单个空格,则str将被拆分   空白,带有前导空格和连续空格   字符被忽略。

     

如果pattern是Regexp,则str在模式匹配的位置被划分。   只要模式与零长度字符串匹配,str就会被分割成   个性人物。如果模式包含组,则各自   匹配也将在数组中返回。

     

如果省略pattern,则值为$;用来。如果$;是零(这是   默认情况下,str在空白上拆分,就像指定了'。

     

如果省略limit参数,则尾随空字段为   抑制。如果limit是正数,则最多为该数   将返回字段(如果limit为1,则返回整个字符串   作为数组中的唯一条目)。如果是否定的,则没有限制   返回的字段数,而不是尾随空字段   抑制。

" now's  the time".split        #=> ["now's", "the", "time"]

虽然这是此编辑中当前版本的ruby,但我在1.7(IIRC)上学到了,其中也有效。我刚刚在1.8.3上测试过它。

答案 1 :(得分:11)

我知道这是一个老问题,但对于寻找比string.split更复杂的东西的其他人来说,这可能会有用。我写了words_counted gem来解决这个特殊问题,因为定义单词非常棘手。

gem允许您定义自己的自定义条件,或使用开箱即用的regexp,这对于大多数用例非常方便。您可以使用各种选项预先过滤单词,包括字符串,lambda,数组或其他正则表达式。

counter = WordsCounted::Counter.new("Hello, Renée! 123")
counter.word_count #=> 2
counter.words #=> ["Hello", "Renée"]

# filter the word "hello"
counter = WordsCounted::Counter.new("Hello, Renée!", reject: "Hello")
counter.word_count #=> 1
counter.words #=> ["Renée"]

# Count numbers only
counter = WordsCounted::Counter.new("Hello, Renée! 123", rexexp: /[0-9]/)
counter.word_count #=> 1
counter.words #=> ["123"]

gem提供bunch more useful methods

答案 2 :(得分:2)

如果在这种情况下'word'可以被描述为包含' - '的字母数字序列,则以下解决方案可能是合适的(假设与'word'模式不匹配的所有内容都是分隔符):


>> 'one-way street'.split(/[^-a-zA-Z]/).size
=> 2
>> 'one-way street'.split(/[^-a-zA-Z]/).each { |m| puts m }
one-way
street
=> ["one-way", "street"]

但是,正则表达式中还可以包含一些其他符号 - 例如,'支持“it's”之类的单词。

答案 3 :(得分:1)

这非常简单,但如果您输入的文字夹在中间,则可以完成工作。它最终计算数字,但我相信你可以编辑代码不计算数字。

puts "enter a sentence to find its word length: "
word = gets
word = word.chomp
splits = word.split(" ")
target = splits.length.to_s


puts "your sentence is " + target + " words long"

答案 4 :(得分:1)

最好的方法是使用 split 方法。 split 基于分隔符将字符串划分为子字符串,返回子字符串的数组。 split 有两个参数,即; 模式限制 pattern 是将字符串拆分为数组的分隔符。 limit 指定结果数组中的元素数。 有关更多详细信息,请参阅Ruby文档:Ruby String documentation

str = "This is a string"
str.split(' ').size
#output: 4

上面的代码将字符串拆分到找到空格的位置,因此它给出了字符串中间接数组大小的字数。

答案 5 :(得分:0)

上述解决方案有误,请考虑以下事项:

"one-way  street"

你会得到

["one-way","", "street"]

使用

'one-way street'.gsub(/[^-a-zA-Z]/, ' ').split.size

答案 6 :(得分:0)

这仅在ASCII空白字符上分割单词:

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