2015-03-29 1 views
-1

Я ответил на свой вопрос. Забыл инициализировать count = 0Считать заглавные буквы каждого предложения в абзаце Ruby

У меня есть куча предложений в абзаце.

  1. a = "Hello there. this is the best class. but does not offer anything." в качестве примера.
  2. Чтобы выяснить, если первая буква капитализируются, моя мысль заключается в .split строковое так что a_sentence = a.split(".")
  3. Я знаю, что могу "hello world".capitalize! так, что если бы это было nil это значит для меня, что это было уже капитализируются EDIT
  4. Теперь я могу использовать метод массива, чтобы пройти через значение и использование ".capitalize!
  5. и я знаю, что я могу проверить, если что-то .strip.capitalize!.nil?

Но я не могу показаться, что выход сколько было капитализировано.

EDIT

a_sentence.each do |sentence| 
     if (sentence.strip.capitalize!.nil?) 
      count += 1 
      puts "#{count} capitalized" 
     end 
    end 

Он выдает:

1 capitalized 

Спасибо за вашу помощь. Я буду придерживаться вышеуказанного кода, который я могу понять в рамках, которые я знаю только в Ruby. :)

+1

Вы получаете эту ошибку, потому что вам нужно сначала определить 'count'. Попробуйте добавить 'count = 0' перед использованием' count + = 1', вне цикла. – bmpasini

ответ

1

Попробуйте это: название

b = [] 
a.split(".").each do |sentence| 
    b << sentence.strip.capitalize 
end 
b = b.join(". ") + "." 
# => "Hello there. This is the best class. But does not offer anything." 
1

Ваш пост является ввести в заблуждение, потому что из вашего кода, кажется, что вы хотите получить кол-прописных букв в начале предложения.

Предполагая, что каждое предложение заканчивает на период (полная остановка), затем пробел, следующее должно работать для вас:

split_str = ". " 
regex = /^[A-Z]/ 

paragraph_text.split(split_str).count do |sentence| 
    regex.match(sentence) 
end 

И если вы хотите, чтобы просто убедиться, что каждая из которых начинается буква капитализируются , вы можете попробовать следующее:

paragraph_text.split(split_str).map(&:capitalize).join(split_str) + split_str 
0

вы можете посчитать, сколько были капитализированы, как это:

a = "Hello there. this is the best class. but does not offer anything." 
a_sentence = a.split(".") 

a_sentence.inject(0) { |sum, s| s.strip!; s.capitalize!.nil? ? sum += 1 : sum } 
# => 1 

a_sentence 
# => ["Hello there", "This is the best class", "But does not offer anything"] 

А потом положил его обратно вместе, как это:

"#{a_sentence.join('. ')}." 
# => "Hello there. This is the best class. But does not offer anything." 

EDIT

Как мотивационные @Humza, вы могли бы использовать count:

a_sentence.count { |s| s.strip!; s.capitalize!.nil? } 
# => 1 
+1

Взгляните на мой ответ. Вы можете просто передать блок для 'count' и сделать вещи намного проще. – Humza

+0

Я получил это благодаря! @Humza – mythoslife

+0

@victorkohl да Мне нравится a_sentence.count {| s | s.strip !; s.capitalize! .nil? } лучше :) спасибо! – mythoslife

1

Там нет необходимости разбить строку в предложения:

str = "It was the best of times. sound familiar? Out, damn spot! oh, my." 

str.scan(/(?:^|[.!?]\s)\s*\K[A-Z]/).length 
    #=> 2 

Регулярное выражение может быть записано с документацией, добавив x после закрытия /:

r =/
    (?:  # start a non-capture group 
     ^|[.!?]\s # match^or (|) any of ([]) ., ! or ?, then one whitespace char 
    )   # end non-capture group 
     \s*  # match any number of whitespace chars 
     \K  # forget the preceding match 
     [A-Z]  # match one capital letter 
    /x 

a = str.scan(r) 
    #=> ["I", "O"] 
a.length 
    #=> 2 

Вместо Array#length, вы можете использовать свой псевдоним, size или Array#count.

Смежные вопросы