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

slhcrj9b  于 2023-03-08  发布在  Ruby
关注(0)|答案(8)|浏览(126)

有没有比string.scan(/(\w|-)+/).size更好的东西(-是这样的,例如,“one-way street”算作2个单词而不是3个)?

kognpnkq

kognpnkq1#

string.split.size

编辑以说明多个空间
Ruby String Documentation page
拆分(模式=$;,[限制])→数组
根据分隔符将字符串划分为子字符串,并返回这些子字符串的数组。
如果pattern是字符串,则在拆分字符串时将其内容用作分隔符。如果pattern是单个空格,则按空格拆分str,并忽略前导空格和连续空格字符。
如果pattern是Regexp,则str在模式匹配的位置被拆分。每当模式匹配零长度字符串时,str被拆分为单个字符。如果pattern包含组,则相应的匹配项也将在数组中返回。

    • 如果省略pattern,则为$的值;。如果$;为nil(默认值),则字符串按空格拆分,就像指定了""一样。**

如果省略limit参数,则隐藏尾随空字段。如果limit为正数,则最多返回该数目的字段(如果limit为1,则返回整个字符串作为数组中的唯一条目)。如果为负数,则对返回的字段数没有限制,并且不隐藏尾随空字段。

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

虽然这是目前的ruby版本,但我在1.7(IIRC)上学习过,在那里也能用,我只是在1.8.3上测试过。

xmjla07d

xmjla07d2#

我知道这是一个老问题,但这可能对其他寻找比string.split更复杂的东西的人有用。我编写words_counted gem来解决这个特定的问题,因为定义单词是相当棘手的。
gem允许您定义自己的自定义条件,或者使用开箱即用的regexp,这对于大多数用例来说都非常方便,您可以使用各种选项预过滤单词,包括字符串、lambda、数组或其他regexp。

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

oaxa6hgo

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”这样的单词。

q0qdq0h2

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"
q1qsirdb

q1qsirdb5#

最好的方法是使用 split 方法。split 根据分隔符将字符串划分为子字符串,并返回子字符串的数组。split 带两个参数,即;patternlimitpattern是分隔符,字符串将按此分隔符拆分为数组。limit指定结果数组中的元素数。有关详细信息,请参阅Ruby文档:Ruby字符串文档

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

上面的代码在发现 * 空格 * 的地方分割字符串,因此它给予了字符串中的单词数,这间接地了数组的大小。

eoxn13cs

eoxn13cs6#

以上解决方案是错误的,请考虑以下几点:

"one-way  street"

你会得到

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

用途

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

disho6za7#

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

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

bd1hkmkf8#

例如,计算文件中“战争与和平”的单词数:

acc = 0
File.readlines('war_and_peace.txt').each { |line| acc += line.split.size }

acc
 => 238610

相关问题