Домашнее задание на неделю 46

Задания на освоение регулярных выражений IEEE Std 1003.1-2017 (POSIX.1-2017) и сходных с ними форм записи строковых шаблонов. Контрольный срок сдачи — .

  1. Ознакомившись с разделом 9 (Regular Expressions) IEEE Std 1003.1-2017 (POSIX.1-2017), выразите следующие условия на строки в виде основного (basic) и расширенного (extended) регулярных выражений.

    1. Строка начинается на произвольное (включая 0) количество пробельных символов, за которыми следует одна или более цифр и хотя бы один пробельный символ.

    2. Строка содержит хотя бы один символ из множества aeiou, но не заканчивается на такой символ.

  2. Помимо поиска строк, удовлетворяющих заданным критериям, регулярные выражения могут быть также использованы для извлечения данных, или выполнения «сложных» замен в тексте — как, например, программой sed.

    Предложите варианты использования sed для преобразования текста по следующим образцам.

    1. Исходный текст:
      1571374521   wa/42.ru.xhtml
      1571973477   wa/43.ru.xhtml
      1573184146   wa/45.ru.xhtml
      
      Целевой текст:
      wa/42.ru.xhtml
      wa/43.ru.xhtml
      wa/45.ru.xhtml
      
    2. Исходный текст:
      printf ("Hello, world!\n");
      s = "-XXX-\n"; printf ("%s", s);
      printf ("total: %d\n", total);
      
      Целевой текст:
      fputs ("Hello, world!\n", stdout);
      s = "-XXX-\n"; fputs (s, stdout);
      printf ("total: %d\n", total);
      
    3. Исходный текст:
      гвизарменный обруч +3 (9008 монет) (разумный)
      
      Целевой текст:
      9008,"гвизарменный обруч +3 (разумный)"
      
    4. Исходный текст:
      <ol>
      <li><p>Привет, мир!</p></li>
      </ol>
      
      Целевой текст:
      <ol>
      <li ><p >Привет, мир!</p></li>
      </ol>
      
    5. Исходный текст:
      unit: sectors
      
      /dev/sdx1 : start=        8192, size=    31108096, type=c
      
      Целевой текст:
      31108096+8192
      
  3. Для шаблонов, используемых в отношении имен файлов, POSIX предлагает более простую форму записи. Ознакомившись с разделом Pattern Matching Notation, предложите шаблон, которому соответствуют файловые имена, начинающиеся на 100, 200 или 300, находящиеся в поддиректориях текущей директории, имена которых заканчиваются на hap и не начинаются на точку (.)

    (Например, такому шаблону должно соответствовать имя Chap/100000.xhtml, но не .hidden/200.)

  4. Опишите действие следующих Perl-совместимых регулярных выражений (PCRE.) Приведите примеры соответствующих строк и извлекаемых (capture) из них данных.

    Обратите внимание на использование в выражениях опций x, i!

    1. (?xi)
      ^ welcome \s+ - \s+ size \s+ (\d+)
        \s+ digest \s+ sha256
        \s+ start \s+ (\d+)
        (?: \s+ count \s+ (\d+))?
        \s* $
      | ^ block \s+ (\d+) \s+ size \s+ (\d+)
        (?: \s+ sha256 \s+ ([0-9a-zA-Z+/]{43}))?
        (?: \s+ (last))?
        \s* $
      | ^ (eof) \s* $
      
    2. (?xi)
      ^ (hello) \s+ -
        (?: \s+ size \s+ (\d+))?
        (?: \s+ digest \s+ sha256)?
        (?: \s+ start \s+ (\d+))?
        (?: \s+ count \s+ (\d+))?
        \s* $
      | ^ send \s+ (\d+) \s* $
      
  5. Поддержка регулярных выражений не ограничивается инструментами, описываемыми POSIX; так, соответствующие функции можно найти в системах управления реляционными базами данных PostgreSQL и MariaDB.

    Приведите два существенно различных примера использования (нетривиальных) регулярных выражений в SQL-запросах. Опишите их работу. Укажите возможные недостатки использования регулярных выражений при поиске записей.