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

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)

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

Ruby String Documentation页面

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上测试过它.

  • 这不是为了返回其大小而不必要地创建单词数组吗?如果文本中有 10,000 个单词怎么办?这会浪费空间并且因此会更慢。 (2认同)

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提供了一堆更有用的方法.