Регулярные выражения · Из qed регулярные выражения...

40
Регулярные Регулярные выражения выражения

Upload: others

Post on 12-Aug-2020

32 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

РегулярныеРегулярныевыражениявыражения

Page 2: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

ИсторияИстория

Кен Томпсон добавил поиск по регулярному выражению вредактор QEDв конце 1960-х, позаимствовав нотацию изтеоретической статьи КлиниИз QED регулярные выражения перекочевали в ed

Page 3: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Существующие стандартыСуществующие стандарты

Стандарт POSIX:Basic Regular Expressions (BRE)Extended Regular Expressions (ERE)

Поддерживаются в утилитах Unix 

Perl Compatible Regular ExpressionsИз Perl синтаксис заимствован в Java, .NET, Python, Ruby,JavaScript, и т.д.

Page 4: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Регулярные выраженияРегулярные выражения

Формальный язык поиска и осуществления манипуляций сподстроками в тексте, основанный на использованииметасимволов (wildcard)По сути это «шаблон», состоящий из символов иметасимволов и задающий правило поиска.

Page 5: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

ШаблоныШаблоны

Символы в шаблонах делятся на два типа:

Литералы – обычные символыМетасимволы – символы, которые используются длязамены других символов или их последовательностей

Page 6: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

ЛитералыЛитералы

все символы за исключением специальных[ ] \ ^ $ . | ? * + ( ) { }

специальные символы экранированные \например: \[ или \$

Page 7: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Метасимвол .Метасимвол .

Обозначает один любой символ Пример:st..d–регулярное выражение, под его описание подходит:standardstandastddd

Page 8: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Символьные классыСимвольные классы

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

[A-Z] – любая заглавная латинская буква[a-d] – строчная буква от a до d[A-Za-z0-9] – латинская буква или цифра[А-Яа-яЁё] – любая русская буква

Page 9: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Символьные классыСимвольные классы

Спецсимвол отрицания в символьных классах:                                        ^ (крышка) 

[^abc] - все символы (не буквы, а именно символы) кромебукв латинского алфавита a, b, c.

Page 10: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

ПеречислениеПеречисление

Вертикальная черта разделяет допустимые варианты. 

gray|grey соответствует gray или greygr(a|e)y описывают строку gray или grey

Page 11: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Позиция внутри строкиПозиция внутри строки

Page 12: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

КвантификацияКвантификация

Page 13: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

ПримерПример

Проверка MAC-адреса ^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$

Page 14: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

ПримерПример

Page 15: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

ПримерПример

Проверка MAC-адреса ^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$

Page 16: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

КвантификацияКвантификация

Ленивые выраженияЖадные выраженияРевнивые (сверхжадные) выражения

Page 17: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Жадная квантификацияЖадная квантификация

Выражение (<.*>) соответствует строке,содержащейнесколько тегов HTML-разметки, целиком.<p><b>Википедия</b>—свободнаяэнциклопедия, вкоторой <i>каждый</i>может изменить или дополнитьлюбуюстатью</p>

Page 18: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Ленивая квантификацияЛенивая квантификация

Чтобы выделить отдельные теги, можно применитьленивую версию этого выражения: (<.*?>). Ей соответствуетне вся показанная выше строка, а отдельные теги:<p><b>Википедия</b>—свободная энциклопедия, вкоторой <i>каждый</i> может изменить или дополнитьлюбую статью</p>

Page 19: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Ревнивая квантификацияРевнивая квантификация

Захватывает самое большое вхождение.В каком-то смысле, ещё «жаднее» жадных и идет дальшених: один раз что-то «схватив», они никогда неоткатываются назад, они не «отдают» кусочки схваченногоими следующим частям регекспа.

Page 20: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

ГруппировкаГруппировка

Круглые скобки используются для определения областидействия и приоритета операций.Например, выражение (тр[ау]м-?)* найдётпоследовательность вида трам-трам-трумтрам-трум-трамтрум.

Page 21: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Группировка с обратной связьюГруппировка с обратной связью

При обработке выражения подстро́ки, найденные пошаблону внутри группы, сохраняются в отдельной областипамяти и получают номер начиная с единицы.Каждой подстроке соответствует пара скобок в регулярномвыражении.Квантификация группы не влияет насохранённый результат,то естьсохраняется лишь первое вхождение

Page 22: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Группировка без обратной связиГруппировка без обратной связи

(?:шаблон)

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

Page 23: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Атомарная группировкаАтомарная группировка

(?>шаблон)

Не создает обратных связей.Такая группировка запрещает возвращаться назад построке, если часть шаблона уже найдена

Page 24: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Basic regular expressionsBasic regular expressions

Все символы трактуются буквально, исключая

 \ (.*[., ]\ )*([0-9]*\.[0-9]*\$)

Точка в [ ] и вне трактуется по-разному( ) и { } в качестве синтаксического элемента необходимопредварять“\”Чтобы искать сами точку, доллар и другие метасимволы, ихнужно экранировать( ) и { } без “\” ищет сами символы скобок

       . [ ] [^ ] ^ $ * \{ \} \( \) \n

Page 25: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Extended regular expressionsExtended regular expressions

Добавлено:                                             ? + |Исключено:

\n–из-за высокой вычислительной стоимостиИзменено:

Символы скобок ( ) { } как синтаксические элементы нетребуют “\” перед собой, для поиска самих этих символов“\”теперь нужен

Page 26: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Выражения в стиле perlВыражения в стиле perl

Ленивые квантификаторы: *?, +?, ??Сверхжадные квантификаторы: *+, ++, ?+Сокращенные записи символьных классов:  \w,\W,\s,\S, ...Lookaheads и lookbehinds – подсказки алгоритму поискаИменованные группы связывания (named capture groups)Рекурсивные шаблоны 

Page 27: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

sedsed

sed [OPTION]... {script} [input-file]... 

sed – Stream EDitorЧитает входной поток строка за строкой, на лету изменяяего в соответствии со скриптом.Язык sed имеет всего около дюжины команд, но хитрости ихприменения достойны целой книги

 

Page 28: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

sedsed

Для работы sed необходим скрипт. Его можно передатьтремя способами:

sed -e script [input-file]sed -f script-file [input-file]sed [options] script [input-file]

В последнем случае скриптом считается первый аргумент,не являющийся параметром ключа

 

Page 29: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

sedsed

sed построчно прочитывает весь вход один раз.К каждой строке поочередно применяется одна и та жепоследовательность команд, записанная в скриптеРезультат направляется в stdout, если sed был запущен сключом -i, то записывается поверх исходного файла

 

Page 30: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

sedsed

Sed имеет два буфера для данных:Pattern space – основнойHold space – дополнительный

Команды оперируют их содержимым.Каждая вновь прочитанная строка входа автоматическизаписывается в pattern space. На вывод подается то, что внем оказалось в конце работы скрипта

 

Page 31: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

НумерацияНумерация

Команда “=” добавляет номер в начало строки $ sed -e '=' helloworld.cpp1 #include<cstdio>2 void main() {3 printf("Hello,world\n");4 } 

Page 32: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

УдалениеУдаление

Команда “d” очищает pattern space и заставляет прочитатьследующую строку входа $ sed -e 'd' helloworld.cpp(вывод пуст – pattern space каждый раз очищается) 

Page 33: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Номера строкиНомера строки

Можно указать номер строки, к которой применяется команда: $sed -e '3d' helloworld.cpp#include<cstdio>void main() {} 

Page 34: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Диапазон строкДиапазон строк

$ sed -e '2,4d' helloworld.cpp#include<cstdio> В файле осталась только первая строка 

Page 35: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Адресация по регулярному выражениюАдресация по регулярному выражению

$ sed -e '/{/, /}/d' helloworld.cpp#include<cstdio> Регулярное выражение должно быть окружено косымичертами: “/regexp/” Sed по умолчанию ожидает регулярные выражения всинтаксисе BRE.Если вызвать с ключом -r, sed будет интерпретировать их какERE.

Page 36: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

ЗаменаЗамена

$ sed -e 's/@/at/' emails.txt Было: [email protected]Стало: john.doeatexample.com Команда “s” в таком виде применяется к строке только одинраз в том месте, где нашлось первое соответствие выражению.Чтобы заменить все соответствия в строке, нужнодобавить“g”(global):$ sed-e 's/@/at/g' emails.txt

Page 37: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

ЗаменаЗамена

$ sed -r -e  's/[0-9]+:[0-9]+:[0-9]+/ & UTC/'times.txt Было:21:16:15Стало:21:16:15 UTC & заменяется найденной подстрокой 

Page 38: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

ЗаменаЗамена

$ sed -r -e 's/([0-9]+):([0-9]+):([0-9]+)/ \1 hours \2 minutes \3seconds/' times.txt Было: 21:16:15Стало: 21 hours 16 minutes 15 seconds \n заменяется n-ой группой связывания 

Page 39: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Вставка строкВставка строк

a \text - вставляет text ниже текущей строки (append)i \text - вставляет text выше текущей строки (insert)c \text - вставляет text вместо текущей строки (change) $sed-e 'a\ \n' readme.txt Команда вставляет дополнительный перенос строки в концекаждой из строк 

Page 40: Регулярные выражения · Из QED регулярные выражения перекочевали в ed. С ущ е ств ую щ и е ста н д а р ты

Hold spaceHold space

$sed -e '1!G;h;$!d' forward.txt > backward.txt 1!G – для каждой строки, кроме первой, дописываетсодержимое holdspace в конец pattenspaceh – копирует содержимое pattern space в holdspace$!d – применяет “d” ко всем строкам, кроме последнейИтого, по завершении работы, в pattern space содержится“перевернутый” текст