Итак, я сделал:
a = ["HellO", "hello", "World", "worlD"]
b = 0
a.each do |x|
b += x.scan(/[A-Z]/).length
end
puts b # Which equals 4 in this case
Проблема, с которой я столкнулся в некоторых из приведенных выше ответов с моим массивом. За ответ Кэри я получаю 3, в которых почему-то отсутствует одна из заглавных букв. За ответ Себастьяна я также получаю 3, в которых также почему-то отсутствует одна из заглавных букв.
В моем массиве 2 заглавные буквы в первой строке, 1 в третьей и 1 в четвертой.
Конечно, более нормальный способ ruby будет с b += x.scan(/[A-Z]/).count
вместо .length
, но он работает для меня в irb.
Некоторые примеры вывода с моей консоли трех методов:
030 > a.grep(/\p{Lu}/).size
=> 3
:031 > a.count {|string| /[[:upper:]]/ =~ string}
=> 3
:026 > a.each do |x|
:027 > b += x.scan(/[A-Z]/).length
:028?> end
=> ["HellO", "hello", "World", "worlD"]
:029 > b
=> 4
Похоже, что два приведенных выше примера регулярных выражений просто проверяют наличие заглавной буквы в строке и считают ее как единое целое, так что если у вас было несколько в той же строке, что и мой первый "HellO"
, то он считается только как один:
:039 > ["HellO"].grep(/\p{Lu}/).size
=> 1
:040 > ["HellO"].count {|string| /[[:upper:]]/ =~ string}
=> 1
Конечно, это может не иметь значения для вас, но если строка длиннее, чем одно слово, она может очень хорошо:
2.5.3 :045 > a = ["Hello World"]
2.5.3 :047 > a.each do |x|
2.5.3 :048 > b += x.scan(/[A-Z]/).count
2.5.3 :049?> end
=> ["Hello World"]
2.5.3 :050 > b
=> 2
2.5.3 :051 > a.count {|string| /[[:upper:]]/ =~ string}
=> 1
2.5.3 :052 > a.grep(/\p{Lu}/).size
=> 1
С двумя словами в одной строке вы можете увидеть разница.
Конечно, я подсчитываю общее количество заглавных букв, когда вы спросили:
i want to know how many element (how many string) in this array contains an uppercase letters
В этом случае любой из двух вышеупомянутых ответов прекрасно работает:)