15
Лекция 5. Регулярные выражения www.compscicenter.ru 1 Толстиков Никита [email protected] СS центр 19.03.2014

Технологический семинар: Регулярные выражения

Embed Size (px)

DESCRIPTION

* Зачем нужны реглярные выражения? * Типы регулярных выражений * Введение в синтаксис PCRE * “Жадные” и не “жадные” регулярные выражения * Спосообы применения регулярных выражений: поиск и замена

Citation preview

Page 1: Технологический семинар: Регулярные выражения

Лекция  5.  Регулярные  выражения  

www.compscicenter.ru   1  

Толстиков  Никита  [email protected]  

СS  центр    

19.03.2014  

Page 2: Технологический семинар: Регулярные выражения

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

www.compscicenter.ru   2  19.03.2014  

• Регулярные  выражения  (Regular  Expressions,  RegExp)  —  это  формальный  язык  поиска  и  осуществления  манипуляций  с  подстроками  в  тексте.  

• Более  простые  аналоги  —  wildcards,  файловые  маски.  

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

• Различные  реализации  отличаются  в  деталях,  но  принципы  создания  регулярных  выражений  везде  одинаковы.  

• Две  основные  задачи:  поиск  и  замена.      

Page 3: Технологический семинар: Регулярные выражения

BRE  

www.compscicenter.ru   3  19.03.2014  

• Синтаксис  BRE  (basic  regular  expressions)  на  данный  момент  определён  POSIX  как  устаревший.  • BRE  широко  распространён  из  соображений  обратной  совместимости.  • Многие  UNIX-­‐утилиты  используют  такие  регулярные  выражения  по  умолчанию.  

   

Page 4: Технологический семинар: Регулярные выражения

ERE  

www.compscicenter.ru   4  19.03.2014  

• Синтаксис  ERE  (Extended  Regular  Expressions)  определён  в  POSIX.  • Отличия  от  BRE:  

• Отменено  использование  обратной  косой  черты  для  метасимволов  ‘{}’  и  ‘()’.  • Обратная  косая  черта  перед  метасимволом  отменяет  его  специальное  значение.  • Добавлены  метасимволы  ‘+’,  ‘?’,  ‘|’.  • Возможность  использования  символьных  классов  POSIX  

   

Page 5: Технологический семинар: Регулярные выражения

Основные  операторы  

www.compscicenter.ru   5  19.03.2014  

• Логическое  “или”  ‘|’  —  разделяет  допустимые  варианты:    black|block  

•  Группировка  ‘()’  —  определяет  область  действия  и  приоритет  операторов.  

 b(lo|a)ck  • Произвольный  символ  ‘.’.  

 bl.ck  • Список  символов  ‘[]’.  

 bl[ao]ck  • При  замене  можно  ссылаться  на  группы:  

 s/(black|white)  (cat|dog)s/\2s  are  \1/  

Page 6: Технологический семинар: Регулярные выражения

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

www.compscicenter.ru   6  19.03.2014  

•  Замыкание  Клини  ‘*’  —  любое  количество  повторений  (в  т.ч.  0).    noo*  

•  “Плюс”  ‘+’  —  хотя  бы  одно  повторение.    no+  

•  “Вопрос”  ‘?’  —  не  более  одного  повторения.    bl?ack  

• Явное  указание  количества  ‘{}’.    wazzu{1,7}p  no{4,}  

Page 7: Технологический семинар: Регулярные выражения

Продвинутые  операторы  

www.compscicenter.ru   7  19.03.2014  

• Список  запрещённых  символов  ‘[ˆ]’.    bl[ˆio]ck  

• Интервалы  символов  [  -­‐  ].    [A-­‐Z][a-­‐z]+  [1-­‐9][0-­‐9]*  

• Якоря:  начало  строки  ˆ  и  конец  строки  $.      ˆ[A-­‐Z][a-­‐z]+  [1-­‐9][0-­‐9]*$  

• Классы  символов  POSIX:  [:alnum:],  [:cntrl:],  [:lower:],  [:upper:],  [:space:],  [:word:],  [:alpha:],  [:digit:],  [:print:],  [:blank:],  [:graph:],  [:punct:],  [:xdigit:]  

 [[:alpha:]]+  [[:digit:]]+  

Page 8: Технологический семинар: Регулярные выражения

PCRE  

www.compscicenter.ru   8  19.03.2014  

• Perl  compaGble  regular  expressions.  • Поставляется  в  виде  отдельной  библиотеки.  • Добавлено  множество  специальных  символов  и  модификаторов.  

• Короткие  синонимы  для  классов  символов:    \w,  \W  —  буква,  всё  кроме  букв;    \d,  \D  —  цифра,  всё  кроме  цифр.  

• Атомарные  группировки  ‘(?:)’.    b(?:lo|a)ck  

• Ограничители  слов:  \b  • Модификаторы:    i  регистронезависимый  поиск;  

               m  многострочный  режим;                    s  символ  ‘.’  совпадает  и  с  переносом  строки;                  A  привязка  к  началу  текста;                  E  привязка  к  концу  текста;                    U  инвертирует  “жадность”;  

Page 9: Технологический семинар: Регулярные выражения

Жадность  квантификаторов  

www.compscicenter.ru   9  19.03.2014  

• Квантификаторы  могут  иметь  один  из  трёх  типов  жадности:  o  жадный  —  квантификатор  захватывает  как  можно  больше;  o  ленивый  —  квантификатор  захватывает  как  можно  меньше;  o  сверхжадный  (ревнивый)  —  квантификатор  захватывает  как  можно  

больше  и  не  отдаёт  назад.  • Обозначение  квантификаторов  разной  жадности:  

Жадный     Ленивый   Сверхжадный  

*   *?   *+  

?   ??   ?+  

+   +?   ++  

{n,  }   {n,  }?   {n,  }+  

Page 10: Технологический семинар: Регулярные выражения

grep  

www.compscicenter.ru   10  19.03.2014  

• Название  представляет  собой  акроним  английской  фразы  «search  Globally  for  lines  matching  the  Regular  Expression,  and  Print  them».  •  Есть  несколько  синонимов:    

 egrep  =  grep  -­‐E  (ERE)    grep  -­‐P  использует  PCRE    rgrep  =  grep  -­‐r  

• Пример  использования:    $  grep  -­‐E  ’ˆ[bcBC]at’  heroes.txt    $  rgrep  apache  /etc  

Page 11: Технологический семинар: Регулярные выражения

sed  

www.compscicenter.ru   11  19.03.2014  

• Потоковый  редактор  вроде  ed.  • Обрабатывает  текст  в  один  прогон.  • Команды  редактирования:    

 [  addr  [  ,  addr  ]  ]  cmd  [  args  ]  • Примеры:  

$  sed  -­‐e  ’/secret/d’  text.txt  $  sed  -­‐e  ’s/<[ˆ>]*>//g;/ˆ\s*$/d’  index.html  

Page 12: Технологический семинар: Регулярные выражения

Простые  примеры  

www.compscicenter.ru   12  19.03.2014  

• Слово  с  дефисами:    ˆ[a-­‐z0-­‐9]+(-­‐[a-­‐z0-­‐9]+)*$  

• Имя  пользователя:    ˆ[a-­‐z0-­‐9_-­‐]{3,16}$  

• Пароль:      ˆ[a-­‐z0-­‐9_!@$%ˆ&*()+=-­‐]{6,18}$  

• XML  тег:    <([a-­‐z]+)([ˆ>]+)*(?:>(.*)<\/\1>|\s+\/>)  

•  Email:    ˆ([a-­‐z0-­‐9_\.-­‐]+)@([a-­‐z0-­‐9_\.-­‐]+)\.([a-­‐z\.]{2,6})$  

Page 13: Технологический семинар: Регулярные выражения

Не  такие  уж  простые...  

www.compscicenter.ru   13  19.03.2014  

•   Выражение  для  e-­‐mail  соответствующее  RFC  822.  (?:(?:\r\n)?[  \t])*(?:(?:(?:[^()<>@,;:\\".\[\]  \000-­‐\031]+(?:(?:(?:\r\n)?[  \t]  

)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[  \t]))*"(?:(?:          [78  строк]  

|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[  \t])*))*\>(?:(  

?:\r\n)?[  \t])*))*)?;\s*)  

• Регулярные  выражения  не  предназначены  для  разбора  сложно  структурированных  текстов  (вроде  HTML  и  XML).  

Page 14: Технологический семинар: Регулярные выражения

Полезные  ссылки  

www.compscicenter.ru   14  19.03.2014  

• Expresso:    http://www.ultrapico.com/expresso.htm  

• Visual  REGEXP:    h¤p://laurent.riesterer.free.fr/regexp/  

   

Page 15: Технологический семинар: Регулярные выражения

Спасибо  за  внимание  

www.compscicenter.ru   15  19.03.2014