Чтобы отклонить все блоки с 20 или более одинаковыми заглавными буквами:
$stdin.each_line do |data|
blocks = data.scan(/\+[^+]+\+/)
('A'..'Z').each do |ch|
r = Regexp.new("[" + ch + "]{20,}")
blocks.reject! { |b| r =~ b }
end
p blocks
end
Это строит 26 регулярных выражений (по одному для каждого заглавного символа) и сопоставляет блоки с ними.
Конечно, было бы гораздо эффективнее создать их только один раз и сохранить их в массиве или подобном, а не перестраивать их для каждой строки входных данных.
Более компактное решение:
r = /([a-z])\1{19,}/
$stdin.each_line do |data|
blocks = data.scan(/\+[^+]+\+/)
blocks.reject! { |b| r =~ b }
p blocks
end
В этом примере используется одно регулярное выражение для сопоставления с одним символом и сразу 19 или более вхождений одного и того же символа (с использованием обратной ссылки).