стандартный ввод не работает рубин - PullRequest
0 голосов
/ 13 апреля 2011

У меня есть следующий скрипт:

$stdin.each_line do |data|    
  blocks = data.scan(/\+[^+]+\+/)
  blocks.reject! { |b| b.include? "AAAAAAAAA" }    
  p blocks    
end

Этот скрипт удалит эту строку A в файле stdin.У меня есть два вопроса:

  1. Кажется, что стандартный ввод не работает, он выводит [].
  2. Как я могу изменить сценарий, чтобы сказать, что отклонить отрезок одногобуквы длиной 20 или более , поэтому, если есть растяжка 20 или более букв A, снимите блок.

Ответы [ 2 ]

0 голосов
/ 13 апреля 2011

Регулярное выражение для вашего отказа! утверждение:

/([A-Z])\1{19}/

Это соответствует любой заглавной букве, за которой следует еще 19 таких же букв.

0 голосов
/ 13 апреля 2011

Чтобы отклонить все блоки с 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 или более вхождений одного и того же символа (с использованием обратной ссылки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...