Лекция Зачем спо в школе?
Вид материала | Лекция |
Содержание13.2 Базовые регулярные выражения Применение базовых регулярных выражений. |
- Ясаков Александр Геннадьевич. Вшколе третий год эксперимент. Неутихающие споры в учительской:, 174.31kb.
- Сергей Кремлёв Зачем убили Сталина, 5558.27kb.
- Рандеву с неудачником, 2676.71kb.
- Марченко Алексей Михайлович Болезнь? Ну и хрен с ней! Вступление Ну зачем, зачем, 2343.21kb.
- Марченко Алексей Михайлович - "Болезнь? Ну и хрен с ней!" Вступление Ну зачем, зачем, 3184.4kb.
- Е. В. Чудинова Зачем нужна биология в школе?, 98.05kb.
- «Зоар» с комментарием «Сулам». Глава «Шемот» Зачем в изгнание и почему в Египет?, 5641.69kb.
- Лекция Что такое жизнь с точки зрения химика. Зачем "Науки о живом", 65.58kb.
- План вступление: а зачем изучать теорию литературы в школе; б изучение тл по программе, 341.08kb.
- Лекция для родителей «готовность ребенка к школе», 308.68kb.
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'
$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-тексте{Материала этой и шестой “лекций”, в общем, достаточно для ее решения.}.