Анимация
JavaScript
|
Главная Библионтека 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 |