Лекция Зачем спо в школе?

Вид материалаЛекция

Содержание


13.2 Базовые регулярные выражения
Применение базовых регулярных выражений.
Подобный материал:
1   ...   14   15   16   17   18   19   20   21   22

13.2 Базовые регулярные выражения


Переходя к рассмотрению более сложных, чем “глоббинг”, базовых регулярных выражений, используемых многими стандартными утилитами (такими как sed, grep, vi) для поиска, замены, выбора текста, определим регулярное выражение более формально.

Регулярное выражение — это последовательность символов. При использовании (передаче в качестве аргумента программе или вводе в ходе сеанса редактирования) регулярное выражение (шаблон) обычно{Исключением являются утилиты семейства grep.} окружается ограничителями — двумя одинаковыми символами, обозначающими его начало и конец, но не являющимися частью самого выражения. За исключением особых случаев в качестве ограничителей принято брать прямую косую черту (/, слэш), она окрущает выражения и во всех нижеприведенных примерах.

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

В буквальном значении символ автонимен, т.е. обозначает сам себя. /а/ обозначает букву “а”, /слово/ означает слово “слово”.

В синтаксисе базовых регулярных выражений определены следующие специальные символы.
  • Любой одиночный символ обозначается точкой (.), а не вопросительным знаком, как при “глоббинге” имен файлов.
  • Квадратные скобки ([ и ]) так же, как и при “глоббинге”, используются для задания списков и диапазонов.
  • Знак каретки () имеет специальное значение в первой позиции внутри квадратных скобок. В этом случае он означает отрицание: /[А-Яа-я]/ соответствует “любой букве русского алфавита”, а /[А-Яа-я]/ — “любому символу, кроме букв русского алфавита”. Чтобы включить его в список, достаточно поместить его в любую другую позицию: /[~`]/ — это “тильда, апостроф или знак каретки”.
  • Специальные значения, которые слишком сложны, чтобы их здесь рассматривать, в первой позиции внутри квадратных скобок имеют также точка (.), знак равенства (=) и двоеточие (:).
  • Каретка в начале выражения означает начало строки: T найдет заглавное “Т”, начинающее строку. Подобно этому знак доллара ($) в конце выражения означает конец строки.
  • Звездочка тоже используется в значении “нуля или более вхождений символа”, но по-другому — для этого она должна следовать за таким символом. Шаблон /A*/ соответствует “A”, “AA”, “AAA” и т.д. Звездочка может следовать и за выражением, например, /[А-Яа-я]*/ означает “любую последовательность букв русского алфавита”. Любая последовательность любых символов может быть обозначена /.*/.
  • Обратная косая черта (\, “бэкслэш”) “экранирует” следующий за нею символ, то есть отменяет его специальное значение. /\./ означает точку, /\*/ — звездочку, а /\\/ — обратную косую черту. Обратная косая черта, за которой следует цифра, также имеет специальное значение, которое здесь не рассматривается.

Кроме того, регулярные выражения могут включать скобочные конструкции. В качестве скобок используются последовательности \( и \) (это совершенно нелогичное обратное (не отменяющее специальное значение следующего символа, а, наоборот, придающее ему специальное значение) значение бэкслэша обусловлено чисто историческими причинами: скобочные выражения вводились в синтаксис регулярных выражений, когда он уже устоялся). Например, шаблон /\(аб\)*/ соответствует строкам “аб”, “абаб”, “абабаб” и т.д. Скобочные конструкции могут быть вложенными. В стандарте определены также скобочные конструкции вида \{ и \}, которые мы здесь рассматривать не будем.

Применение базовых регулярных выражений. Давайте попробуем решить простую реалистичную{Хотя и не реальную, ибо для нее есть более подходящие инструменты.} задачу, требующую применения регулярных выражений. Предположим, у нас есть файл index.phpl, содержащий текст “лекций” этого курса в формате HTML (Рис. 3){Такой файл и вправду можно найти на ссылка скрыта.}, а нам нужен “плоский” текст. Мы знаем, что html-файл — это последовательность меток, заключенных в угловые скобки, и размеченного ими текста, и наша задача сводится таким образом к удалению всех подстрок, заключенных в угловые скобки, вместе с этими скобками{Нижеприведенный пример, строго говоря, справедлив только в случае, если каждая метка находится в пределах одной строки. Синтаксис HTML этого не требует, символ новой строки теоретически может встретиться и внутри тега, между его аргументами.}.


Рис. 13-3


Из шестой “лекции” мы уже знаем, что автоматически обработать текст можно с помощью утилиты-потокового редактора (текстового процессора) sed. Остается составить регулярное выражение-шаблон.

Казалось бы, это просто: нам нужна открывающая угловая скобка, за которой следует любое количество символов, завершающееся закрывающей угловой скобкой, т.е., в синтаксисе базовых регулярных выражений /<.*>/. Команда “заменить все совпадающие подстроки на пустые” будет выглядеть так: $ sed 's/<.*>//g'
$ sed 's/<.*>//g'


Максим Отставнов <


Исходные "Лекции" публиковались в

На сегодня в школе, как и в

некоторых других сегментах рынка, доминируют "альтернативные", нестандарные

<...>


Рис. 4

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

Нужно модифицировать наше регулярное выражение, добавив условие, чтобы в найденной подстроке содержался только один закрывающий тег. Оно выглядит так: sed 's/<[>]*>//g' ]*>//g' /g' >index.txt.}.

$sed 's/<[>]*>//g'


Свободное программное обеспечение в школе

Свободное программное обеспечение в школе

Версия 0.6


Максим Отставнов <maksim@otstavnov.com>


© 2002-3, Максим Отставнов.

© 2002, Андрей Добровольский (раздел 10.4).

Разрешается использование на условиях GNU FDL в.1.1 или последующих версий, опубликованных Фондом свободного программного обеспечения. Документ не содержит неизменяемых разделов в терминологии GNU FDL. Прочие права сохраняются за авторами.

Исходные "Лекции" публиковались в приложении к газете "Первое сенября" "Информатика" (ember.ru) в 2002-3 г.

vnov.com/fsft

Лекция 0. Зачем СПО в школе?


0.1 Свободное и несвободное ПО На сегодня в школе, как и в

некоторых других сегментах рынка,

<...>


Рис. 5

В качестве упражнения остается обратная задача: вывод всех меток, использованных в данном html-тексте{Материала этой и шестой “лекций”, в общем, достаточно для ее решения.}.