有什么比string.scan(/(\w|-)+/).size
更好(-
是这样的,例如,“单行道”算作2个单词而不是3个单词?)
答案 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"]
答案 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