Регулярные выражения: различия между версиями
Содержимое удалено Содержимое добавлено
→«Жадные» выражения: пунктуация |
Oleg4280 (обсуждение | вклад) оформление |
||
Строка 1:
{{википедия}}
'''Регуля́рные выраже́ния''' ({{lang-en|regular expressions}}, [[w:жаргон|жарг.]] '''''регэ́кспы''''' или '''''ре́гексы''''') — система обработки текста, основанная на специальной системе записи образцов для поиска. Образец ({{lang-en|pattern}}), задающий правило поиска, по-русски также иногда называют «шаблоном», «маской».
Сейчас регулярные выражения используются многими текстовыми редакторами и утилитами для поиска и изменения текста на основе выбранных правил. Многие языки программирования уже поддерживают регулярные выражения для работы со строками. Например, [[w:Perl|Perl]] и [[w:Tcl|Tcl]] имеют встроенный в их синтаксис механизм обработки регулярных выражений. Набор утилит (включая редактор sed и фильтр grep), поставляемых в дистрибутивах Unix, одним из первых способствовал популяризации понятия регулярных выражений.
== Базовые понятия ==
Регулярные выражения используются для сжатого описания некоторого [[w:множество|множества]] строк с помощью шаблонов, без необходимости перечисления всех элементов этого множества. При составлении шаблонов используется специальный [[w:Синтаксис (программирование)|синтаксис]], поддерживающий, обычно, следующие операции:
; Перечисление
: Вертикальная черта разделяет допустимые варианты. Например, «gray|grey» соответствует ''gray'' или ''grey''.
Строка 28:
== В теории формальных языков ==
Регулярные выражения состоят из [[w:константа|констант]] и [[w:оператор|оператор]]ов, которые определяют [[w:множество|множества]] [[w:строка (программирование)|строк]] и множества [[w:операция|операций]] на них соответственно. На данном конечном [[w:алфавит|алфавит]]е Σ определены следующие константы:
* (''пустое множество'') ∅ обозначает ∅
* (''пустая строка'') ε обозначает множество {ε}
* (''[[w:строка (тип данных)|строка]]'') ''a'' в Σ обозначает множество {''a''}
и следующие операции:
* (''связь'', ''конкатенация'') ''RS'' обозначает множество { αβ | α из ''R'' и β из ''S'' }. Пример: {"ab", "c"}{"d", "ef"} = {"abd", "abef", "cd", "cef"}.
* (''перечисление'') ''R|S'' обозначает объединение ''R'' и ''S''.
* (''[[w:звезда Клини|''замыкание Клини'', ''звезда Клини'']]'') ''R''* обозначает минимальное [[
Многие книги используют символы ∪, + или ∨ для перечисления вместо вертикальной черты.
Строка 67:
|- valign="top"
|\''n''
|Где ''n'' — это [[w:цифра|цифра]] от 1 до 9; соответствует ''n''-му отмеченному подвыражению. Эта конструкция теоретически '''нерегулярна''', она не была принята в расширенном синтаксисе регулярных выражений.
|- valign="top"
|*
Строка 79:
|}
Различные реализации регулярных выражений интерпретируют обратную косую черту перед метасимволами по-разному. Например, [[w:egrep|egrep]] и [[w:Perl|Perl]] интерпретируют скобки и вертикальную черту как метасимволы, если перед ними ''нет'' обратной косой черты и воспринимают их как обычные символы, если черта есть.
Многие диапазоны символов зависят от выбранных настроек локализации. POSIX стандартизовал объявление некоторых классов и категорий символов, как показано в следующей таблице:
Строка 172:
=== «Жадные» выражения ===
Квантификаторам в регулярных выражениях соответствует максимально длинная строка из возможных (квантификаторы являются «жадными», англ. ''greedy''). Это может оказаться значительной проблемой. Например, часто ожидают, что выражение <code><nowiki>(<.*>)</nowiki></code> найдёт в тексте [[w:тег|тег]]и [[w:HTML|HTML]]. Однако этому выражению соответствует целиком строка
<code>{{Highlight|<nowiki><p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью</p></nowiki>}}</code>.
Строка 195:
=== Современные (расширенные) регулярные выражения в POSIX ===
Регулярные выражения в [[w:POSIX|POSIX]] аналогичны традиционному Unix-синтаксису, но с добавлением некоторых метасимволов:
{|
Строка 211:
Также было отменено использование обратной косой черты: \{…\} становится {…} и \(…\) становится (…).
=== Perl-совместимые регулярные выражения ([[w:PCRE|PCRE]]) ===
Регулярные выражения в [[w:Perl|Perl]] имеют более богатый и в то же время предсказуемый синтаксис, чем даже в POSIX. По этой причине очень многие приложения используют именно Perl-совместимый синтаксис регулярных выражений.
=== Группы ===
Строка 231:
== Реализации ==
* NFA (Nondeterministic Finite State Machine; [[
* DFA (Deterministic Finite-state Automaton; [[
== Литература ==
Строка 242:
|издание =
|место = М.
|издательство = [[w:Вильямс (издательство)|«Вильямс»]]
|год = 2006
|страницы =496
Строка 255:
|издание =
|место = М.
|издательство = [[w:Вильямс (издательство)|«Вильямс»]]
|год = 2004
|страницы = 192
Строка 269:
== Ссылки ==
* [http://www.regular-expressions.info/ Regular-Expressions.info — Regex Tutorial, Examples and Reference - Regexp Patterns]
* [http://www.regexguru.com/ Regex Guru Blog]
* [http://
* [http://xregexp.com/ The one of a kind JavaScript regular expression library]
* [http://regexpal.com/ A JavaScript regular expression tester]
* [http://
* [http://easyregexp.ru/ Онлайн сервис по работе с регулярными выражениями]
* [http://www.pcre.ru/ PCRE.RU — Регулярные выражения, примеры, документация и шаблоны в perl, php, javascript, apache]
* [https://regex101.com/ Online regex tester and debugger: JavaScript, Python, PHP, and PCRE]
* [http://reg-exp.com/ Regular expression tester]
* [http://www.regexplanet.com/ RegexPlanet — Online Regular Expression (Regex) Testing and Cookbook]
* [http://www.rexegg.com/ Regex Tutorial: From Regex 101 to Advanced Regex]
* [http://javascript.ru/basic/regular-expression Регулярные выражения в JavaScript]
* [http://2lx.ru/2009/02/regulyarnye-vyrazheniya-v-c/ Регулярные выражения в C#]
▲* [http://easyregexp.ru/ Онлайн проверка и оптимизация регулярных выражений]
|