Иерархия
Хомского
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
-
и
другими.
|
|
Регулярные выражения
используются многими текстовыми редакторами и утилитами.
Регулярные выражения
состоят из операторов
(определяют множества операций)
и констант (определяют множества строк):
Константы
(величины, значение которых не меняется):
Операторы (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
|
|