有没有比string.scan(/(\w|-)+/).size更好的东西(-是这样的,例如,“one-way street”算作2个单词而不是3个)?
string.scan(/(\w|-)+/).size
-
kognpnkq1#
string.split.size
编辑以说明多个空间从Ruby String Documentation page拆分(模式=$;,[限制])→数组根据分隔符将字符串划分为子字符串,并返回这些子字符串的数组。如果pattern是字符串,则在拆分字符串时将其内容用作分隔符。如果pattern是单个空格,则按空格拆分str,并忽略前导空格和连续空格字符。如果pattern是Regexp,则str在模式匹配的位置被拆分。每当模式匹配零长度字符串时,str被拆分为单个字符。如果pattern包含组,则相应的匹配项也将在数组中返回。
如果省略limit参数,则隐藏尾随空字段。如果limit为正数,则最多返回该数目的字段(如果limit为1,则返回整个字符串作为数组中的唯一条目)。如果为负数,则对返回的字段数没有限制,并且不隐藏尾随空字段。
" now's the time".split #=> ["now's", "the", "time"]
虽然这是目前的ruby版本,但我在1.7(IIRC)上学习过,在那里也能用,我只是在1.8.3上测试过。
xmjla07d2#
我知道这是一个老问题,但这可能对其他寻找比string.split更复杂的东西的人有用。我编写words_counted gem来解决这个特定的问题,因为定义单词是相当棘手的。gem允许您定义自己的自定义条件,或者使用开箱即用的regexp,这对于大多数用例来说都非常方便,您可以使用各种选项预过滤单词,包括字符串、lambda、数组或其他regexp。
string.split
words_counted
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。
oaxa6hgo3#
如果这种情况下的'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”这样的单词。
q0qdq0h24#
这是相当简单的,但如果你输入的单词之间有空格,它也会计算数字,但我相信你可以编辑代码,不计算数字。
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"
q1qsirdb5#
最好的方法是使用 split 方法。split 根据分隔符将字符串划分为子字符串,并返回子字符串的数组。split 带两个参数,即;pattern和limit。pattern是分隔符,字符串将按此分隔符拆分为数组。limit指定结果数组中的元素数。有关详细信息,请参阅Ruby文档:Ruby字符串文档
str = "This is a string" str.split(' ').size #output: 4
上面的代码在发现 * 空格 * 的地方分割字符串,因此它给予了字符串中的单词数,这间接地了数组的大小。
eoxn13cs6#
以上解决方案是错误的,请考虑以下几点:
"one-way street"
你会得到
["one-way","", "street"]
用途
'one-way street'.gsub(/[^-a-zA-Z]/, ' ').split.size
disho6za7#
这将仅在ASCII空白字符上拆分单词:
p " some word\nother\tword|word".strip.split(/\s+/).size #=> 4
bd1hkmkf8#
例如,计算文件中“战争与和平”的单词数:
acc = 0 File.readlines('war_and_peace.txt').each { |line| acc += line.split.size } acc => 238610
8条答案
按热度按时间kognpnkq1#
编辑以说明多个空间
从Ruby String Documentation page
拆分(模式=$;,[限制])→数组
根据分隔符将字符串划分为子字符串,并返回这些子字符串的数组。
如果pattern是字符串,则在拆分字符串时将其内容用作分隔符。如果pattern是单个空格,则按空格拆分str,并忽略前导空格和连续空格字符。
如果pattern是Regexp,则str在模式匹配的位置被拆分。每当模式匹配零长度字符串时,str被拆分为单个字符。如果pattern包含组,则相应的匹配项也将在数组中返回。
如果省略limit参数,则隐藏尾随空字段。如果limit为正数,则最多返回该数目的字段(如果limit为1,则返回整个字符串作为数组中的唯一条目)。如果为负数,则对返回的字段数没有限制,并且不隐藏尾随空字段。
虽然这是目前的ruby版本,但我在1.7(IIRC)上学习过,在那里也能用,我只是在1.8.3上测试过。
xmjla07d2#
我知道这是一个老问题,但这可能对其他寻找比
string.split
更复杂的东西的人有用。我编写words_counted
gem来解决这个特定的问题,因为定义单词是相当棘手的。gem允许您定义自己的自定义条件,或者使用开箱即用的regexp,这对于大多数用例来说都非常方便,您可以使用各种选项预过滤单词,包括字符串、lambda、数组或其他regexp。
gem提供了一个bunch more useful methods。
oaxa6hgo3#
如果这种情况下的'word'可以描述为一个字母数字序列,其中可以包括'-',那么下面的解决方案可能是适当的(假设所有不匹配'word'模式的内容都是分隔符):
然而,还有一些其他的符号可以包含在正则表达式中-例如,'来支持像“it' s”这样的单词。
q0qdq0h24#
这是相当简单的,但如果你输入的单词之间有空格,它也会计算数字,但我相信你可以编辑代码,不计算数字。
q1qsirdb5#
最好的方法是使用 split 方法。split 根据分隔符将字符串划分为子字符串,并返回子字符串的数组。split 带两个参数,即;pattern和limit。pattern是分隔符,字符串将按此分隔符拆分为数组。limit指定结果数组中的元素数。有关详细信息,请参阅Ruby文档:Ruby字符串文档
上面的代码在发现 * 空格 * 的地方分割字符串,因此它给予了字符串中的单词数,这间接地了数组的大小。
eoxn13cs6#
以上解决方案是错误的,请考虑以下几点:
你会得到
用途
disho6za7#
这将仅在ASCII空白字符上拆分单词:
bd1hkmkf8#
例如,计算文件中“战争与和平”的单词数: