2017-02-14 1 views
2

저는 문장을 구두점과 같이 간단히 끝내고 나누어서 계산할 수있는 지점에 왔습니다! ? .루비를 사용하여 단락에서 문장의 수를 계산하십시오.

그러나, 나는 그것과 같은 복잡한 문장을 위해 일해야합니다

"학습 루비는 큰 노력이다 !!!! 글쎄,이 시간에 어려울 수 있습니다 ..."여기를

구두점이 반복되는 것을 볼 수 있습니다. 내가 지금까지 무엇을 가지고

은 간단한 문장과 함께 작동한다 :

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

코칭이없는 전체 단어가 아니라 즉시 세트, 글자 또는 그룹화에 바인딩되지만 그것은 단지 "하나 이상의"것을 의미합니다. .'dogs +'는 "개"와 "dogssss"를 "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!". 

BTW, 심지어 tadman의 해결책은 정확하지 않습니다. 다음 단일 문장에 대해 5를 계산합니다.

The IP address of Mr. Sloopsteen's dishwasher is 192.168.101.108! 
관련 문제