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

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

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

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

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

    3. Строка не соответствует регулярному выражению ^$.

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

    5. Строка начинается с целого числа не меньшего 104857610 в шестнадцатеричной записи, за которым не следует непробельного символа.

    6. Строка включает каждую из подстрок alice, bob, charlie — в любом порядке. Каждая подстрока, кроме того, может начинаться с заглавной буквы (т. е., условию удовлетворяет исходная строка alice!Charlie, bobsmith — но не, например, bobsmith#chaRlie, alice.)

    7. Строка включает по меньшей мере две (различные) подстроки из списка homesteaders, Mitty's, quilted, revises — в любом порядке.

    8. Строка содержит по меньшей мере одно слово из списка ниже, не являющееся подстрокой какого-либо иного слова (т. е., условию не удовлетворяет строка команднострочный интерфейс.)

      • строчного
      • строчный
      • строчным
      • строчных
    9. Строка начинается с двух одинаковых алфавитноцифровых последовательностей, разделенных одиночным пробельным символом.

    10. Строка начинается с целого отрицательного числа в десятичной записи, за которым следует пробельный символ и равное ему по абсолютному значению положительное число в десятичной записи.

    11. Строка начинается с косой черты (/) и состоит исключительно из разделенных ею же непустых алфавитноцифровых последовательностей (например: /привет/мир.)

    12. Строка не заканчивается подстрокой ignore.

  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* $
      
    3. (?xi)
      ^ (?: \/\/)?
      ((?: commons | meta | species) \. wikimedia
       | (?: (?: [[:alpha:]-]+)
             \. (?: wiki (?: books | news | source | versity)
                 | wiktionary)
             | web \. archive)
         \. org)
      /? $
      
  5. Поддержка регулярных выражений не ограничивается инструментами, описываемыми POSIX; так, соответствующие функции можно найти в системах управления реляционными базами данных PostgreSQL и MariaDB.

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