Tom*_*man 25 ruby ruby-on-rails
有什么比这更好的string.scan(/(\w|-)+/).size(-例如,"单行道"算作2个单词而不是3个单词)?
Kit*_*YMG 51
string.split.size
Run Code Online (Sandbox Code Playgroud)
编辑以避开多个空间的愚蠢浪潮
split(pattern = $;,[limit])→anArray
将str分为基于分隔符的子字符串,返回这些子字符串的数组.
如果pattern是String,则在拆分str时将其内容用作分隔符.如果pattern是单个空格,则str在空格上拆分,前导空格和连续空格字符的运行被忽略.
如果pattern是Regexp,则str在模式匹配的位置被划分.只要模式匹配零长度字符串,str就会分成单个字符.如果pattern包含组,则相应的匹配也将在数组中返回.
如果省略pattern,则$;的值; 用来.如果$; 是nil(这是默认值),str在空格上分割,就像指定了''一样.
如果省略limit参数,则禁止尾随空字段.如果limit是正数,则最多将返回该字段数(如果limit为1,则整个字符串将作为数组中的唯一条目返回).如果为负数,则返回的字段数没有限制,并且不会抑制尾随空字段.
" now's the time".split #=> ["now's", "the", "time"]
Run Code Online (Sandbox Code Playgroud)
虽然这是编辑中当前版本的ruby,但我在1.7(IIRC)上学到了,其中也有效.我刚刚在1.8.3上测试过它.
Moh*_*mad 12
我知道这是一个古老的问题,但这可能对其他寻找更复杂的东西的人有用string.split.我写了words_counted宝石来解决这个特殊问题,因为定义单词非常棘手.
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"]
Run Code Online (Sandbox Code Playgroud)
gem提供了一堆更有用的方法.