Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [ 26 ] 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

6-й час

Поиск по шаблону


Из предыдущего занятия вы узнали много о чтении данных из файлов. Эта информация и уже известные вам сведения о скалярах, массивах и операторах являются необходимой теоретической базой для создания программ данных. Но, к сожалению,

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

Для этого нужно уметь распознавать в потоке ввода фрагменты текста, соответствующие некоторым шаблонам, извлекать данные с использованием этих шаблонов и, возможно, преобразовать эти данные в более удобную для использования форму. Регулярные выражения- одно из средств т1, предназначенное для выполнения этих задач. Заметим, что в данной книге термины регулярное выражение и шаблон являются эквивалентными.

Регулярные выражения - это фактически язык в языке. Они предоставляют формальный метод описания шаблонов для поиска. На этом занятии мы рассмотрим только начальные сведения о языке регулярных выражений.


В документации содержится намного более подробное (и гораздо бопветрудное для восприятия) описание языка регулярных выражений в Perl {обратитесь к странице perlre). Это настолько сложная тема, что ей посвящены целые книги. Сообщество Perl для дальнейщего изучения регулярных выражений рекомендует книгу Джеффри Фрейдла (Jeffrey Е. F. FreidI) Mastering Regular Expressions (Sebastopol: OReilly, 1997). В ней рассматривается использование регулярных выражений не только в Perl, но именно Perl уделено особое внимание.

Регулярные выражения используются и в других языках программирования, включая TCL, JavaScript, Python и С, а также во многих утилитах операционной системы UNIX. В Perl регулярные выражения представлены достаточно полно, и их знание поможет вам в освоении других языков программирования.

Основные темы этого занятия.

• Как создавать простые регулярные выражения.

• Как использовать регулярные выражения для поиска по шаблону.

• Как редактировать строки при помощи регулярных выражений.



Простые шаблоны

В Perl шаблоны помешаются в оператор поиска по шаблону, который обычно выглядит как т/Л ВОТ пример простого шаблона:

ш/Simon/

Этот шаблон соответствует последовательности букв Но вот только где он

ищет эту последовательность? Ранее вы узнали, что в Perl часто используется стандартная переменная $ . Так вот, поиск по шаблону происходит в переменной $ , если не будет указана другая неременная (об этом мы поговорим позже). Итак, предыдущий шаблон ишет последовательность символов S-i-ia-o-n в скалярной неременной $ .

Если в неременной $ найдена строка, соответствующая шаблону, оператор т возвращает истинное значение. Поэтому обычно поиск по шаблону используют в условных выражениях, как показано ниже:

I Здесь строка "Piglet" присутствуй в $

Внутри шаблона каждый символ соответствует самому себе, если только это не метасимвол. Большинство обычных символов (буквы и цифры) соответствуют сами себе. Метасимволы - это символы, изменяющие поведение шаблонов. Вот список метасимволов:

$ ( ) \ 0 [{ ? . + *

Их действие будет объяснено чуть позже. Если же в шаблоне вы хотите использовать метасимвол как литерал, необходимо перед ним поставить обратную косую черту,

например:

/Я честно вгиграл \$10/; $ в данном случае?" не метасимвол, а просто знак доллара.

Оператор поиска по шаблону обычно имеет вид 11. Тем не менее в нем можно заменить символы косой черты на любой другой символ, как в следующем примере:

Ido,) { print "Найдено слово Waldo. \n"j}

Подобная замена символов часто делается, если в шаблоне есть символы косой черты, что может привести к неправильному определению конца шаблона. Поэтому перед вложенным символом косой черты должен быть символ обратной косой черты, например:

\/bin\/hangiiian/) {print "Найдена игра hangman!;}

Этот же пример можно переписать в более читабельном виде:

if (roj/usr/local/bin/hangman:) {print "Найдена игра hangraan!";}

В операторе поиска по шаблону можно обойтись и без префикса если в качестве

ограничителей шаблона используются символы косой черты. Так, вместо m/Cheetos/ можно написать /Cheetos/. Обычно, если не нужно заменять символ-ограничитель, так и поступают.

В регулярных выражениях можно использовать переменные. Встретив в регулярном выражении имя переменной, Perl сначала вычисляет значение этой переменной,

а затем уже использует получившийся шаблон. Это позволяет создавать регулярные выражения на ходу. В приведенном ниже примере регулярное выражение, используемое в операторе if, считывается с клавиатуры:

96 Часть I. Основы Perl



$pat=<STDIS>; chomp Spat;

$ ="Стро!са, в которой будет выполняться поиск"; if (/$pat/){ f Используется пшблон, введенный пользователем print "Строка \-$ V- соответствует пиблону $pat\n";


Для обозначения регулярных выражений в руководстве и документации часто используются сокращения RE или гедехр. Для ясности мы будем по-прежнему называть их регулярными выражениями.

Правила игры

Прежде чем применять регулярные выражения в Perl, сначала нужно узнать, как они используются. Этих правил немного. Все они возникли не на пустом месте, а

имеют определенный смысл. Вот они.

• Обычно поиск по шаблону в строке ведется слева направо.

• Выражение, в котором задан шаблон, возвращает истинное значение (в любом контексте) тогда и только тогда, когда в строке найден текст, полностью

соответствующий шаблону.

• Поиск соответствия шаблону выполняется в строке слева направо. Таким

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

• Прежде всего программа пытается найти самую длинную строку, соответствующую шаблону. Обнаружив первое совпадение, Perl просматривает всю

строку до конца в поиске более длинной фразы, соответствующей заданному шаблону. Для описания этого свойства регулярных выражений придуман

специальный термин - "жадность "регулярных выражений.

Метасимволы

Во всех примерах этого занятия фрагменты текста, совпавшие с шаблоном, подчеркиваются. Помните, что строка называется соответствующей шаблону, если хотя бы ее часть соответствует этому шаблону. Подчеркивание показывает, какая именно часть совпадает.

Не пропустите следующие разделы и не огорчайтесь, если сразу вы поймете не все, - понимание постепенно придет. Давайте начнем с метасимволов.

Простой метасимвол

Первый метасимвол - это точка (.)• Внутри регулярного выражения точка соответствует любому одиночному символу, кроме символа перевода строки. Например, в шаблоне /p.t/ точка означает любой символ. Этому шаблону соответствуют слова pot, pat, pit, carpet, python и p\ip tent. Точка заменяет только один символ. Поэтому слова apt и expect шаблону не подходят, поскольку в первом слове между символами р и t нет никакого символа, а во втором - слишком много символов.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [ 26 ] 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122