2017-02-14 8 views
2

私は文の区切りのように文章を分割して数えることができるようになった! ? 。Rubyを使用して段落内の文章の数を数えよう

しかし、私はそれはのような複雑な文章のために働く必要があります。

「学習Rubyは素晴らしい努力です!!!!まあ、それは時には難しいことができます...」

ここ句読点自体が繰り返されることがあります。

私がこれまで持って、簡単な文章で動作します:

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

ありがとうございます!

答えて

2

それはもう少し寛容であるためにあなたのコードを適応させるために非常に簡単です:

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 

少なくとも一つの非スペース文字を持っているだけでこれらの文字列を選択します:ここではそのための修正があります。

+0

ありがとう、非常に徹底的な答え、それは動作します!私は前に+で演奏しましたが、なんらかの理由でそれを働かせることができませんでした... – alexnewby

+0

何かの "1つ以上"を意味しますが、コーチングなしではなく、 。'dogs +'は "dogs"と "dogsssss"を "dogdog"ではなく、 '(?:dogs)+'は繰り返しインスタンスと一致します。 – tadman

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)/)

直ちに空白文字または文字列の末尾に続くされる一致を必要とする、肯定先読みあります。

1

文字列の数が最も簡単かもしれません。

"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!". 

でも、タドマンの解は正確ではありません。次の1つのセンテンスのために5のカウントを与えるでしょう:

The IP address of Mr. Sloopsteen's dishwasher is 192.168.101.108! 
関連する問題