使用Ruby

时间:2017-02-14 00:58:27

标签: ruby regex count

我已经达到了这样的程度,我可以用简单的句末标点符号来分割和计算句子! ? 。

但是,我需要它来处理复杂的句子,例如:

"学习Ruby是一项伟大的努力!!!!嗯,有时很难......"

在这里你可以看到标点重复。

到目前为止,我使用简单的句子:

def count_sentences
  sentence_array = self.split(/[.?!]/)
  return sentence_array.count
end

谢谢!

3 个答案:

答案 0 :(得分:3)

让你的代码更容易适应:

def count_sentences
  self.split(/[.?!]+/).count
end

不需要中间变量或return

请注意,空字符串也会被捕获,因此您可能希望过滤掉这些字符串:

test = "This is junk! There's a space at the end! "

这将使用您的代码返回3。这是一个解决方案:

def count_sentences
  self.split(/[.?!]+/).grep(/\S/).count
end

这将只选择那些至少有一个非空格字符的字符串。

答案 1 :(得分:3)

class String
  def count_sentences
    scan(/[.!?]+(?=\s|\z)/).size
  end
end

str = "Learning Ruby is great!!!! The course cost $2.43... How much??!"

str.count_sentences
  #=> 3

(?=\s|\z)/)是一个正向前瞻,要求匹配后面紧跟一个空白字符或字符串的结尾。

答案 2 :(得分:1)

字符串#count可能最简单。

"Who will treat me to a beer? I bet, alexnewby will!".count('.!?')

与tadman的解决方案相比,不需要构建中间数组。但是,如果在字符串中找到一系列句点或感叹号,则会产生不正确的结果:

"Now thinking .... Ah, that's it! This is what we have to do!!!".count('.!?')

=> 8

因此,问题是:您需要绝对的,准确的结果,还是只需要近似的结果(如果用于大型印刷文本的统计分析,这可能就足够了)?如果您需要精确的结果,您需要定义,什么是句子,什么不是。想想下面的文字 - 里面有多少个句子?

 Louise jumped out of the ground floor window. 
 "Stop! Don't run away!", cried Andy. "I did not 
 want to eat your chocolate; you have to believe
 me!" - and, after thinking for a moment, he 
 added: "If you come back, I'll buy you a new
 one! Large one! With hazelnuts!".
顺便说一下,甚至塔德曼的解决方案都不准确。对于以下单句,它将计算五个:

The IP address of Mr. Sloopsteen's dishwasher is 192.168.101.108!