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

Ruby on rails 在Ruby中计算字符串中单词的最佳方法?,ruby-on-rails,ruby,Ruby On Rails,Ruby,还有什么比string.scan(/(\w|-)+/).size更好的方法吗(-就是这样,例如,“单向街道”算作2个字而不是3个字) 编辑以解释多个空格 从 拆分(模式=$;,[限制])→ 混乱 基于分隔符将str划分为子字符串,返回一个数组 这些子串的一部分 如果模式是字符串,则将其内容用作分隔符 拆分str时。如果图案是单个空格,则str在 空格,带前导空格和连续空格 已忽略字符。 如果模式是一个Regexp,str将在模式匹配的地方被分割。 只要模式匹配长度为零的字符串,str就会被拆分

还有什么比
string.scan(/(\w|-)+/).size
更好的方法吗(
-
就是这样,例如,“单向街道”算作2个字而不是3个字)


编辑以解释多个空格

拆分(模式=$;,[限制])→ 混乱

基于分隔符将str划分为子字符串,返回一个数组 这些子串的一部分

如果模式是字符串,则将其内容用作分隔符 拆分str时。如果图案是单个空格,则str在 空格,带前导空格和连续空格 已忽略字符。

如果模式是一个Regexp,str将在模式匹配的地方被分割。 只要模式匹配长度为零的字符串,str就会被拆分为 单个字符。如果模式包含组,则相应的 匹配项也将在数组中返回

如果省略模式,则值为$;使用。若美元;是零(这是零) 默认情况下),str在空白处拆分,就像指定了“”一样。

如果省略limit参数,则后面的null字段为空 压制。如果limit为正数,则最多为 将返回字段(如果limit为1,则返回整个字符串 作为数组中的唯一项)。如果为负数,则没有限制 返回的字段数,后面的空字段不为空 压制


虽然在本次编辑中这是ruby的当前版本,但我在1.7(IIRC)上学习了这一点,在那里它也起了作用。我刚刚在1.8.3上测试了它。

如果本例中的“单词”可以描述为包含“-”的字母数字序列,那么以下解决方案可能是合适的(假设与“单词”模式不匹配的所有内容都是分隔符):


但是,在正则表达式中也可以包含一些其他的符号,例如“支持”这样的词:“

< p>以上的解决方案是错误的,考虑以下内容:

"one-way  street"
你会得到

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


此操作仅在ASCII空白字符上拆分单词:

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

我知道这是一个老问题,但这可能对其他正在寻找比
string.split
更复杂的东西的人有用。我写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提供了一个.

这是非常简单的,但是如果您键入的单词之间有空格,它就可以完成这项工作。它最终也会计算数字,但我相信您可以编辑代码,使其不计算数字

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"

最好的方法是使用拆分方法。 split基于分隔符将字符串划分为子字符串,返回子字符串数组。 split采用两个参数,即:模式限制模式是将字符串拆分为数组的分隔符。 limit指定结果数组中的元素数。 有关更多详细信息,请参阅Ruby文档:


上面的代码在找到空格的地方分割字符串,从而给出字符串中的字数,这间接地数组的大小。

定义“单词”的含义?想象下面的字符串:“我是……字符串。”你希望统计多少个单词?非常好的问题亲爱的[在单程和街道之间,有两个空格]不。如果未提供任何参数且
$,Ruby将在空格上拆分(忽略连续和前导/尾随空格。例如
\s+
nil
。请学习Ruby。这个词将空格作为单词(空),考虑一下。不带参数的代码>拆分
默认为空白拆分。(好吧,它将在
$;
上拆分,但是如果这也是
nil
,那么它将在空格上拆分。)Ruby文档将此行为描述为“忽略前导空格和连续空格字符的运行”。这难道不会不必要地创建单词数组以返回其大小吗?如果文本中有10000个单词呢?这会浪费空间,而且速度会因此而变慢。@Ernesto是的,而且。。。实际上,通过这种方式,您可以每秒统计数百万个单词,并且该数组被垃圾收集。过早优化等等。
'one-way street'.gsub(/[^-a-zA-Z]/, ' ').split.size
p "  some word\nother\tword|word".strip.split(/\s+/).size #=> 4
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"]
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"
str = "This is a string"
str.split(' ').size
#output: 4