Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемСветлана Чупрасова
1 Лекция 9 Регулярные выражения Операторы и приоритеты
2 Регулярные выражения Регулярные выражения в Perl чаще всего используются в операторах поиска и замены, таких как s/, m/, операторах связки =~ или !=. Эти операторы имеют схожие опции: iне различать строчные и заглавные буквы. mсчитать строку многострочной. sоднострочная строка. xрасширенный синтаксис (использование пробелов и комментариев)
3 Регулярные выражения Эти опции, обозначаемые как '/x', можно использовать внутри шаблонов, используя конструкцию (?...). В шаблонах используются следующие метасимволы (символы, обозначающие группы других символов): \следующий метасимвол как обычный ^начало строки.один произвольный символ. Кроме '\n' - конец строки. $конец строки |альтернатива (или) ()группировка []класс символов
4 Регулярные выражения Метасимволы имеют модификаторы (пишутся после метасимвола): *- повторяется 0 или большее число раз или большее число раз ?- 1 или 0 раз {n}точно n раз {n,}по меньшей мере раз {n,m}не меньше n, но и не больше m
5 Регулярные выражения Во все других случаях фигурные скобки считаются обычными (регулярными) символами. Таким образом '*' эквивалентна {0,}, '+' - {1,} и '?' - {0,1}. n и m не могут быть больше По умолчанию действие метасимволов "жадно" (greedy). Совпадение распространяется столько раз, сколько возможно, не учитывая результат действия следующих метасимволов.
6 Регулярные выражения Если вы хотите "уменьшить их аппетит", то используйте символ '?'. Это не изменяет значение метасимволов, просто уменьшает распространение. *?станет 0 и более +?1 и более ??0 или 1 раз {n}?точно n раз {n,}?не меньше n раз {n,m}?больше или равно n и меньше m раз
7 Регулярные выражения Шаблоны работают так же, как и двойные кавычки, поэтому в них можно использовать `\` - символы (бэкслэш-символы): \tсимвол табуляции \nновая строка \rперевод каретки \аперевод формата \vвертикальная табуляция \aзвонок \eescape \033восьмеричная запись символа \x1AШестнадцатеричная запись символа
8 Регулярные выражения \c[control символ \lнижний регистр следующего символа \uверхний регистр следующего символа \Lвсе символы в нижнем регистре до \E \Uв верхнем регистре \Eограничитель смены регистра
9 Регулярные выражения В Perl добавлены следующие метасимволы: \wалфавитно-цифровой или '_' символ \W н е алфавитно-цифровой или '_' символ \sодин пробел \Sодин не пробел \dодна цифра \Dодна не цифра
10 Регулярные выражения Обратите внимание - все это "один" символ. Для обозначения последовательности применяйте модификаторы. Так: \w+слово \d+целое число [+-]?\d+целое со знаком [+-]?\d+\.?\d*число с точкой
11 Регулярные выражения Существуют мнимые метасимволы, обозначающие места смены значения: \bграница слова \Bне граница слова \Aначало строки \Zконец строки \Gконец действия m//g
12 Регулярные выражения Граница слова (\b) - это мнимая точка между символами \w и \W. Внутри класса символов '\b' обозначает символ backspace (стирания). Метасимволы \A и \Z - аналогичны '^' и '$', но если начало строки '^' и конец строки '$' действуют для каждой строки в многострочной строке, то \A и \Z обозначают начало и конец всей многострочной строки.
13 Регулярные выражения Если внутри шаблона применяется группировка (круглые скобки), то номер подстроки группы обозначается как '\цифра'. За шаблоном в пределах выражения или блока эти группы обозначаются как '$цифра'. $+обозначает последнее совпадение $&все совпадение $`все до совпадения $'все после совпадения
14 Регулярные выражения Рассмотрим пример:пример $s = "Один 1 два 2 и три 3"; if ($s =~ /(\d+)\D+(\d+)/) { print "$1\n"; # Результат '1' print "$2\n"; # '2' print "$+\n"; # '2' print "$&\n"; # '1 два 2' print "$`\n"; # 'Один ' print "$'\n"; # ' и три 3' }
15 Регулярные выражения Perl версии 5 содержит дополнительные конструкции шаблонов: (?#коммен -тарий) - комментарий в теле шаблона. (?:шаблон)группировка как и '( )', но без обратной ссылки (?=шаблон ) "заглядывание" вперед: /\w+(?=\t)/ (?!шаблон)"заглядывание" вперед по отрицанию.
16 Регулярные выражения Пример - Конструкции шаблонов.Пример $s = "1+2-3*4"; if ($s =~ /(\d)(?=-)/){ print "$1\n"; } else { print "ошибка поиска\n";} $s = "1+2-3*4"; if ($s =~ /(\d)(?!\+)/) { print "$1\n";} else { print "ошибка поиска\n";}
17 Регулярные выражения Правила регулярного выражения.(regex) 1.Любой символ обозначает себя самого, если это не метасимвол. Если вам нужно отменить действие метасимвола, то поставьте перед ним '\'. 2.Строка символов обозначает строку этих символов. 3.Множество возможных символов (класс) заключается в квадратные скобки '[]', это значит, что в данном месте может стоять один из указанных в скобках символов. Если первый символ в скобках это '^' - значит, ни один из указанных символов не может стоять в данном месте выражения.
18 Регулярные выражения Правила регулярного выражения.(regex) 4.Внутри класса можно употреблять символ '-', обозначающий диапазон символов. Например, a-z - одна из малых букв латинского алфавита, цифра. 5.Все символы, включая специальные, можно обозначать с помощью '\' как в языке С. 6.Альтернативные последовательности разделяются символом '|' Заметьте что внутри квадратных скобок это обычный символ. 7.Внутри регулярного выражения можно указывать "подшаблоны" заключая их в круглые скобки и ссылаться на них как '\номер' Первая скобка обозначается как '\1'.
19 Операторы и приоритеты. В Perl ассоциативность и приоритетность операторов аналогична языку С. Любой терм имеет самый высокий приоритет. К терму относятся переменные, кавычки и их операторы, арифметические и логические выражения в скобках, любые функции с параметрами в скобках. Если после любого спискового оператора (print(), и т.д.) или унарного оператора (chdir(), и т.д.) следует левая круглая скобка, то операторы внутри скобок имеют наивысший приоритет.
20 Операторы и приоритеты. Если скобки отсутствуют, то приоритет списковых операторов или наивысший или наименьший в отношении операторов справа или слева от него. = ('a ','b ', print 'c ', 'd '); print Здесь для запятых слева от print он имеет наименьший приоритет, но повышает приоритет правой запятой. Поэтому правая запятая воспринимается как параметр для print и печатается 'c d', а левая просто записывает код завершения операции в и последний print показывает это.
21 Операторы и приоритеты. Оператор '->' Как и в С - это инфиксный оператор переадресации. Если справа от него стоит [...] или {...} выражение, то правая часть может быть непосредственной или символической ссылкой на массив или хеш. В противном случае правая сторона это метод или простой скаляр, содержащий имя метода, а правая - или объект, или имя класса.
22 Операторы и приоритеты. Операторы ++ и --. Работают, как и в С. Употребление инкремента к строковым переменным в Perl имеет особенность. Каждый символ остается в своем классе (большие, малые, цифры) и учитывается перенос предыдущего символа. Таким образом, строковые переменные с цифрами работают как числовые переменные. Пример:Пример: print ++($i = "09"); # "10" print ++($i = "a9"); # "b0" print ++($i = "az"); # "ba" print ++($i = "aZ"); # "bA"
23 Операторы и приоритеты. Оператор ** (возведение в степень): print 4**2 # Результат 16 print -4**2 # Результат -16 Унарные операторы. '\' - получение ссылки на переменную (как & в С) Мультипликативные операторы. 'x' - оператор повторения. В скалярном контексте возвращает строку левой части, повторенную величиной, указанной в правой части. print '*' x 5; # '*****' print (1,2) x 3; # Пример:
24 Операторы и приоритеты. Операторы "привязки" =~ и !=. Эти оригинальные операторы имеют очень широкое применение в Perl. Оператор =~ логически связывает левую часть выражения с патерном (pattern - шаблон) в правой. По умолчанию поиск или изменение по патерну выполняется в переменной $_. Операторы привязки позволяют делать это с любой переменной, указанной в левой части. Логическим результатом будет успех операции.
25 Операторы и приоритеты. Если в правой части вместо патерна присутствует выражение, то результат этого выражения воспринимается как патерн. Однако это не очень эффективно, т.к. патерн будет компилироваться во время исполнения программы, что заметно снизит быстродействие. Оператор != аналогичен =~, только результат совпадения инвертируется (логическое "нет").
26 Операторы и приоритеты. Операторы отношений. Кроме стандартных, имеются следующие: 'lt'- строковое меньше 'gt'- строковое больше 'le'- строковое меньше или равно 'ge'- строковое больше или равно ' - -1 если левая часть меньше правой, 0 если равна, 1 если больше. 'eq'- строковое равно 'ne'- строковое не равно 'cmp'- как и ' ' применительно к строкам
27 Операторы и приоритеты. Логические операторы && (AND) и || (OR). Отличие от подобных операторов в С заключается в том, что в С возвращаемое значение либо 0, либо 1, тогда как в Perl возвращается результат выражения. '&&'- если левое выражение возвращает false, правое не выполняется. '||'- если левое выражение возвращает true, правое не выполняется.
28 Операторы и приоритеты. Оператор диапазона '..' В списковом контексте результат - список с элементами, первый элемент которого это левое выражение и последнее - правое. Значение каждого элемента внутри списка увеличивается на 1. for $i (1..4) { print "$i "; } В скалярном контексте результат - логическое значение. Это false до тех пор, пока левый операнд false. Как только он стал true, результат - true до тех пока правый true, после чего опять - false.
29 Операторы и приоритеты. Операторы ограничители строк. В Perl это операторы, выполняющие разного рода интерполяцию и поиск по шаблону. Фигурные скобки '{}' обозначают любой символ, используемый для ограничителя. В случае использования скобок (круглых '( )', квадратных '[ ]', фигурных '{ }', угловых ' ') в начале ставится открывающаяся скобка, а в конце закрывающая. В строках, допускающих интерполяцию, имена переменных, начинающиеся с символов '$' или - интерполируются, т.е. в строку вставляется значение строки или массива.
30 Операторы и приоритеты. Симво л Полно е ФункцияИнтерполяц ия ''q{}Literalнет ""qq{}Литералда ``qx{}Командада qw{}Список словнет //m{}Шаблонда s{}{}Подстановк а да tr{}{}Трансляциянет
31 Операторы и приоритеты. m/PATERN/gimosx, /PATERN/gimosx Поиск в строке по патерну (шаблону). В скалярном контексте возвращает логическое значение true (1) или false (''). Если строка не указана с помощью операторов '=~' или '!~', поиск ведется в строке $_. Опции: g- Поиск всех вхождений. i- Сравнение не зависит от регистра m- Строка многострочная. o- однопроходная компиляция s- однострочная строка x- расширенные регулярные выражения
32 Операторы и приоритеты. Если '/' - ограничитель, то начальное 'm' можно опустить. PATTERN может содержать переменные, которые будут интерполироваться каждый раз в момент вычисления. Переменные $) и $| не интерполируются. Если хотите, чтобы шаблон интерполировался один раз - ставьте /o. Если PATERN - нулевая строка, используется последнее регулярное выражение. В скалярном контексте возвращается список, элементы которого - результаты выполнения выражений в скобках патерна ($1, $2, $3...). Обратите внимание, что первый элемент $1.
33 Операторы и приоритеты. $a = m[/(\w*)/(\w*)/(\w*)/(\w*)]); Здесь 'm[' - использовать квадратные скобки как ограничители, (\w*)- шаблон алфавитно-цифровой последовательности. В равен ('usr', 'local', 'perl')результате
34 Операторы и приоритеты. q/строка/, 'строка' - Строка литералов. Не интерполируется. Внутри строки - \' или \\ для обозначения символов ' и \ : print 'O\'K'; # O'K qq/строка/, "строка" - Интерполируемая строка: $var = 13; print "\$var = $var"; qx/строка/,`строка` - интерполируется, а потом выполняется как системная команда: print `date`; qw/строка/ Возвращает список, элементы которого - слова строки, разделенные пробелами
35 Операторы и приоритеты. s/шаблон/подстрока/egimosx Поиск по шаблону и в случае успеха замена подстрокой. Возвращает количество произведенных подстановок, иначе false (0). Если строка в которой ведется поиск не указана (операторы =~ или != ), то используется переменная $_. Если в качестве разделителя '/' использовать одинарную кавычку ('), то интерполяции не будет, иначе можно применять переменные в шаблоне или подстроке. Опции:
36 Операторы и приоритеты. e- Рассматривать правую часть как выражение. g- Глобальный поиск. i- Без различия регистра букв m- многострочная переменная o- компилировать шаблон один раз s- однострочная переменная x- расширенное регулярное выражение ПримерПример и его результатрезультат
37 Операторы и приоритеты. tr/таблица1/таблица2/cds, y/таблица1/таблица2/cds Замена всех символов из "таблица1" на соответствующий символ из "таблица2". Результат - количество замен или стираний. Без оператора =~ или != операция выполняется со строкой $_. Опции: c- дополнение "таблица1" d- стереть найденные, но не замененные символы. s- "сжать" повторяющиеся замененные символы. ПримерПример и его результатрезультат
38 Операторы и приоритеты. Операторы ввода-вывода. Первый - скобки из символа '`'. Строка в скобках воспринимается как системная команда и ее результат возвращается как литерал. В скалярном контексте это строка, содержащая весь результат, а в списковом - список, элементы которого - строки результата. Статус выполненной команды хранится в переменной $?. Следующая команда - ' '. Вычисление приводит к чтению строки из файла. 'файл' здесь не имя файла, а указатель файла, который создается функцией open().
39 Операторы и приоритеты. В скалярном контексте читается одна строка вместе с символом '\n', а в списковом - весь файл читается в список, элементы которого - строки файла. В случае обнаружения конца файла результат оператора - false. Если не указана переменная результата, то это $_. Указатель файла по умолчанию STDIN: while() { print; }; Если в командной строке нет никаких аргументов, то читается стандартный ввод, если есть аргументы, то они считаются именами файлов, которые последовательно читаются.
40 Операторы и приоритеты. Если в угловых скобках записана переменная, то содержимое этой переменной считается именем указателя файла или ссылкой на указатель файла. Если такого указателя не существует, то содержимое переменной воспринимается как шаблон имен файлов и результат - имена файлов на диске, подходящих по шаблону:результат while( ) { = ; но лучше = glob("*"); т.к. внутри скобок можно использовать переменные.
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.