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

 

 

 

Иерархия Хомского

 

4 типа грамматик (языковых моделей):

0. неограниченные грамматики — возможны любые правила

1. контекстно-зависимые грамматики.

2. контекстно-свободные грамматики.

3. регулярные грамматики — самые простые (эквивалентны регулярным выражениям).

 

 

Регулярные грамматики

 

Регулярные грамматики:

  • являются подмножеством контекстно-свободных.

  • определяют в точности все регулярные языки,

  • эквивалентны конечным автоматам и регулярным выражениям.

  • применяются для текстового поиска, разбивки и подстановки, в том числе в лексическом анализе.

 

 

 

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

 

Регулярные выражения (regular expressions, жарг. регэ́кспы или ре́гексы) — система обработки текста, основанная на специальной системе записи образцов для поиска.

 

Regex (regular expressions) — формальный язык обработки текста (язык программирования), основанный на использовании wildcard characters (символов-джокеров, метасимволов).

Модель текста на Regex задается pattern (шаблоном, образцом, маской, строкой-образцом), состоящими из символов и метасимволов и определяющими правила (например, поиска).

Регулярные выражения поддерживаются многими языками программирования (встроенным синтаксисом и механизмом обработки):

  • PHP,

  • Perl,

  • Рython,

  • JavaScript,

  • Java,

  • VBA,

  • C#,

  • Visual Basic,

  • ActionScript,

  • Tcl,

  • Ruby,

  • Lua,

  • Gambas,

  • C++,

  • Delphi,

  • .NET Framework

  • и другими.

 


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

Регулярные выражения состоят из операторов (определяют множества операций) и констант (определяют множества строк):

Константы (величины, значение которых не меняется):

  • пустое множество

  • символьный литерал «a» алфавита Σ.

  • пустая строка ε

  • множество {a} из символов, либо из других множеств.

Операторы (statement, инструкции, команды):

  • Конкатенация (сцепление) VS бинарная

  • Перечисление V|S бинарная

  • Квантификация бинарная

  • Звезда (замыкание) Клини V* унарная

  • и др.

 

 

 

Общая схема Regex

 

 

Общая схема:

  • Якорь

  • Набор символов

  • Модификатор

Якорь – определяет позицию шаблона в строке текста (^ – начало строки; $ – конец строки - в том случае, если они являются самым первым и самым последним символами шаблона. Иначе эти символы становятся литералами (представляют сами себя).

 

Набор символов – для поиска соответствий в заданных позициях текста ("точка" – знак любого произвольного символа):

  • символ "точка" (.) соответствует любому произвольному символу;

  • алфавитно-цифровые символы и пробел представляют сами себя;

  • прочие символы – интерпретация зависит от диалекта.

Модификатор – задаёт количество повторов предыдущего символа или набора символов

(в зависимости от диалекта):

* – любое количество повторов символа/набора, в том числе и нулевое;

? – соответствует нулю или одному экземпляру символа/набора;

+ – соответствует одному или большему количеству экземпляров символа/набора.

 

 

 

 

Шпаргалка по Regex

 

шпаргалка (ссылка на ресурс в Сети, требуется доступ)

 

 

 

Сетевой инструментарий по Regex

 

 

Онлайн сервис для работы с регулярными выражениями: http://easyregexp.ru/

 

Easyregexp включает:

  • Конструктор регулярных выражений

  • Проверка регулярных выражений в реальном времени на конкретных примерах

  • Оптимизация регулярных выражений.
     

Онлайн сервис для работы с регулярными выражениями: http://regex101.com/

Regex101 позволяет:

  • деконструировать регэкспы

  • объяснить функцию каждого оператора

  • тестировать код (PHP, javascript, Python)

  • выдавать справочную информацию…

 

Интерактивный кроссворд по регулярным выражениям: http://uzer.com.ua/cross/

 

 

 

 

Примеры RegExp для PHP

 

№1

Найти текст, заключенный в тег и заменить его на другой тег
Например: <TITLE> ... </TITLE> заменить аналогично на <kmp_tag> ... </kmp_tag> в HTML-файле:

preg_replace("!<title>(.*?)</title>!si","<kmp_tag>\\1</kmp_tag>",$string);

2

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

Например, "СЛОВО" (а аткже "слово", "СлОвО" и т.д.) и "ДЕЛО" (различным образом) нужно одинаковым образом заменить - найти перечень слов в любом регистре и вставить по краям найденных слов фиксированные строки (на "<b>" и "</b>").

$string=preg_replace("/(слово1|слово2|дело|слово99)/si","<b>\\1</b>",$string);

2

Разбирает текст на отдельные слова, основываясь на определении: слово - это непрерывная последовательность букв английского или русского алфавитов.


$x="Люди, %^& читайте___kmp-Пособие~~~~__только__ для... зачета!! Для+образования читайте, gервоисточники, kmp";
preg_match_all('/([a-zA-Zа-яА-Я]+)/',$x,$ok);
for ($i=0; $i<count($ok[1]); $i++) echo $ok[1][$i]."<br>";

 

Результат:

Люди
читайте
kmp-Пособие
только
для
зачета
Для
образования
читайте
первоисточники
kmp