我已经达到了这样的程度,我可以用简单的句末标点符号来分割和计算句子! ? 。
但是,我需要它来处理复杂的句子,例如:
"学习Ruby是一项伟大的努力!!!!嗯,有时很难......"
在这里你可以看到标点重复。
到目前为止,我使用简单的句子:
def count_sentences
sentence_array = self.split(/[.?!]/)
return sentence_array.count
end
谢谢!
答案 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!