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

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

Метасимволы вне квадратных скобок

( ) - начало и конец группы, например (text). Означают последовательность. Используются для применения квантификаторов не к одному символу, а к нескольким, а также для дальнейшего использования найденной последовательности.
[ ] - начало и конец описания символьного класса, например [a-z]. Символьный класс возвращает один символ из множества. Изменить это могут повторители.
{ } - начало и конец повторителей, например {3,8}
\ - экранирующий символ, принять метасимвол как обычный символ, например (\\, \., \[, \], \{, \}, \*).
^ - начало строки (или начало текста в многострочных текстах с флагом (?m)), например ^text text$
$ - конец строки (или конец текста в многострочных текстах с флагом (?m)), например ^text text$
. - любой символ, кроме переноса строки @LF (по умолчанию). С флагом (?s) - любой символ
| - символ "или", обычно внутри группы, например (10|20)
? - предыдущий символ либо имеется, либо не имеется, аналогично и для групп. После символа повтора - жадность патерна - (.*?)
* - повтор предыдущего символа или группы 0 и более раз
+ - повтор предыдущего символа или группы 1 и более раз

Метасимволы внутри квадратных скобок

Часть шаблона, заключенная в квадратные скобки, называется символьным классом. Внутри скобок метасимволы теряют свое специальное значение, кроме метасимволов принадлежащих этому классу. Экранировать требуется только 4 символа \ - ] [. Если символ "-" находится в конце перечисления, то не требует экранирования. В шаблоне могут использоваться метасимволы диапазонов, но не используются метасимволы границ, например \A, \B, \Z, \z, а метасимвол \b означает символ возврата 'backspace'. Учтите, что диапазоны, например [а-я] используют UTF-8 последовательность, а не ASCII.

\ - экранирующий символ
^ - символ исключения, но в случае, когда стоит первым, например [^3] все кроме три
- - символ охвата, например [a-z], то есть все символы от a до z
[ ] - начало и конец описания символьного класса, например [a-z]

Метасимволы подстановки

\1 - \9 - ссылка на найденную группу в самом шаблоне и в шаблоне замены. Отсчёт групп слева по открывающей скобке "("
$1 - $9 - ссылка на найденную группу в шаблоне замены
$0 или \0 - весь шаблон поиска или все группы (9 не ограничение)
\a - Chr(7) - символ с десятичным ASCII-кодом 7 (звонок). При выводе воспроизводит звуковой сигнал. BEL (hex 07)
\cn - управляющий символ, который генерируется при нажатии комбинации клавиш Ctrl+n, где n- символ, например \cD соответствует Ctrl+D. \cA = \001, \cZ = \032, \cM = \r = \015
\e - Chr(27) - символ escape (hex 1B)
\f - Chr(12) перенос страницы (hex 0C)
\h - [ \t] - любой горизонтальный пробел, табуляция - Chr(9), Chr(32), Chr(160)
\H - [^\h] - любой символ, который не пробел или табуляция
\K - слева от \K предшествующее совпадение, т.е. текст1\Kтекст2, найти текст2, перед которым текст1.
\n - @LF, Chr(10) - символ переноса на новую строку (hex 0A)
\N - [^\n] Любой символ, который не символ переноса на новую строку (не @LF). Не работает в 3.3.6.1
\Q ... \E - любые метасимволы между \Q и \E воспринимаются как текст. Не исключайте ошибки: \QD:\Edit\1.txt\E
\r - @CR, Chr(13) - символ возврат каретки (hex 0D)
\R - [\n\f\r\v] Chr(10), Chr(11), Chr(12), Chr(13) любой из символов переноса строки
\t - @TAB, Chr(9) символ табуляции - tab (hex 09)
\v - [\r\n\f] Chr(10), Chr(11), Chr(12), Chr(13) вертикальная табуляция (@CR и @LF и перенос страницы)
\V - [^\v] - любой символ, который не Chr(10), Chr(11), Chr(12), Chr(13) вертикальная табуляция (перенос строки)
\x** - где * - любая шестнадцатеричная цифра, например \x41 соответствует латинской букве 'A', \x50\x65\x72\x6C - слово Perl
\x{**..} - где * - любая шестнадцатеричным цифра, например \x{50}\x{65}\x{72}\x{6C} - слово Perl. Попробуйте от \x{01} до \x{7F}, что в десятеричной системе означает символы от 1 до 127. Или в UTF кодировке \x{044F} равный символу "я"
\*** - где * - любая восьмеричная цифра. Например, последовательность \120\145\162\154 представляет слово Perl (\120 - восьмеричный код буквы Р, \145 - буквы е, \162 - буквы r, \154 - буквы l). Пробел - \040. Попробуйте от \001 до \177, что в десятеричной системе означает символы от 1 до 127

Метасимволы для задания групп символов

\d - [0-9] - любая десятичная цифра
\D - [^0-9] любая не цифра
\s - [\f\n\r\t\v ] - пустой символ: Chr(9), Chr(10), Chr(12), Chr(13), Chr(32) (перенос страницы, табуляция, возврат каретки, перевод строки и пробел).
\S - [^\f\n\r\t\v ] - любой непробельный символ
\w - [0-9a-zA-Z_] - любой алфавитно-числовой символ или подчеркивание (только символы латинского алфавита)
\W - [^0-9a-zA-Z_] - любой символ неслова

Границы символов

\A - начало текста, не зависит от флага "(?m)" и поэтому может встретится только 1 раз.
\G - похожий на \A, но несколько раз, если найденные следуют друг за другом от начала.
\z - абсолютный конец текста, не зависит от флага "(?m)" и поэтому может встретится только 1 раз
\Z - конец текста, т. е. граница между любым символом и концом текста или до символа \n, если он в конце строки, не зависит от флага "(?m)" и поэтому может встретится только 1 раз.
\b - начало или конец слова, т. е. граница между символами, один из которых удовлетворяет \W, а другой - удовлетворяет \w (только в англ. текстах)
\B - середина слова, т. е. граница между символами, оба которых удовлетворяют \W или оба которых удовлетворяют \w

Флаги модификаторы

Ставятся в начало регулярного выражения или группы.
Состояние модификаторов выключено по умолчанию, соответственно для использования требуется включить.
Пример использования : (?i)(Text) или ((?-i)Text), допустимо комбинировать (?is)(Text) или ((?imsx)Text)

(?i) - не учитывать регистр символов. Это работает только для символов латинского алфавита.
(?-i) - отменяет ранее включенный (?i)
(?m) - в многострочном тексте символы ^ и $ означают начало и конец строки соответственно, например ^(Text)\r$, иначе начало и конец текста. Символ LF - разделитель строк
(?-m) - отменяет ранее включенный (?m)
(?s) - символ "точка" (.) дополнительно включает в себя перенос строки LF (режим "одна строка")
(?-s) - отменяет ранее включенный (?s)
(?x) - игнорирует пробелы и табуляции в регулярном выражении, кроме тех что в квадратных скобках. Пробелы позволяют сделать регулярное выражение легко читаемым. Позволяет в конце рег. выр. добавить комментарий после символа #
(?-x) - отменяет ранее включенный (?x)
(?J) - allow duplicate names (разрешает дубликаты/двойные названия).
(?U) - инвертировать жадность квантификаторов
(?-U) - отменяет ранее включенный (?U)

Флаги групп

Допустимо комбинировать (?im-sx:Text), флаги sx выключены

(?i:...) - группа, не учитывает регистр символов, например (?i:Text). Это работает только для символов латинского алфавита.
(?-i:...) - группа учитывает регистр символов, например (?-i:Text)
(?:...) - исключает группу из найденных, например (?:Text)
(?>...) - группа не входящая в поиск, но имеет свойство сверхжадного квантификатора, например (?>Text)(Text)

Эти 4 группы имеют фиксированную длину, в них нельзя использовать *, +, {n, m}
(?=...) - группа не входящая в поиск, но проверяющая совпадение образца справа, например (Text)(?=Text)
(?!...) - группа не входящая в поиск, но проверяющая не совпадение образца справа, например (Text)(?!Text)
(?<=...) - группа не входящая в поиск, но проверяющая совпадение образца слева, например (?<=Text)(Text), см. также \K
(?<!...) - группа не входящая в поиск, но проверяющая не совпадение образца слева, например (?<!Text)(Text)

(?<name>...) - именованная ссылка. Вызов именованной ссылки \k<name> это тоже что вызов \1 или $1
(?#...) - группа содержащая комментарий, например (?# это комментарий ). Полностью игнорируется интерпретатором

Повтор предыдущего элемента, применяется к символам и группам (квантификаторы)

{n} - повторить предыдущий символ n раз
{n,} - повторить предыдущий символ n и более раз ( {n,}? - предпочтительно наименьший захват)
{n, m} - повторить предыдущий символ от n до m раз ( {n,m}? - предпочтительно наименьший захват)
* - повторить предыдущий символ 0 и более раз. То же что и {0,}. Наибольший захват, который позволит совпасть оставшейся части шаблона.
+ - повторить предыдущий символ 1 и более раз. То же что и {1,}. Наибольший захват, который позволит совпасть оставшейся части шаблона.
? - предыдущий символ либо имеется, либо не имеется. То же что и {0,1}. Второе значение символа ? после символа повтора .*? - жадность, см. ниже
*? - повторить предыдущий символ 0 и более раз. Ограничится наименьшим захватом, который позволит совпасть оставшейся части шаблона.
+? - повторить предыдущий символ 1 и более раз. Ограничится наименьшим захватом, который позволит совпасть оставшейся части шаблона.
?? - предпочтительно наименьший захват, например ([a-z]??)g для 'gg' возвращает две пустые строки

Ревнивая или сверхжадная квантификация

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

*+ - повторить предыдущий символ 0 и более раз.
++ - повторить предыдущий символ 1 и более раз.
{n,}+ - повторить предыдущий символ n и более раз.

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

Пример [[:upper:]]{2} - поиск повтора заглавных букв. Инвертировать диапазон так: [[:^digit:]]

[:alnum:] - буквы и цифры [0-9A-Za-z] (как \w, но без "_")
[:alpha:] - буквы [A-Za-z] (без "_")
[:ascii:] - символы от Chr(0) до Chr(127)
[:blank:] - пробел и символ табуляции Chr(9) и Chr(32), тоже что [\t ]
[:cntrl:] - управляющие символы от Chr(0) до Chr(31) и Chr(127)
[:digit:] - десятичные цифры, тоже что \d, [0-9]
[:graph:] - тоже что символы, отображаемые при печати [:print:], но кроме пробела (от Chr(33) до Chr(126) )
[:lower:] - прописные буквы [a-z]
[:print:] - символы, отображаемые при печати, включая пробел (от Chr(32) до Chr(126) )
[:punct:] - символы, отображаемые при печати, кроме букв и цифр Chr=(33-47, 58-64, 91-96, 123-126), те, что не входят ни в [:alnum:], ни в [:cntrl:]
[:space:] - пробельные символы (как \s, но включая символ VT: Chr(11) ) от Chr(9) до Chr(13) и Chr(32). Тоже что [\f\n\r\t\v ]
[:upper:] - заглавные буквы [A-Z]
[:word:] - символы слов, тоже что \w
[:xdigit:] - шестнадцатеричные цифры [0-9A-Fa-f]

Условные подмаски

(?(если)то) - например (?(?=[a-z])\d), (?(условие)шаблон_при_успехе)
(?(если)то|иначе) - например (?(?<=\d)a|b) или (?:(?>(?=[^a-z]*[a-z])())?(?:(?=\1)aa|(?!\1)1)), (?(условие)шаблон_при_успехе|шаблон_при_не_успехе)
(?=[\w]+)| (?R) - рекурсивный вызов

 
Эти флаги не действуют в AutoIt3
\p любой символ пунктуации
\l - означает, что следующий символ регулярного выражения преобразуется в нижний регистр.
\u - означает, что следующий символ регулярного выражения преобразуется в верхний регистр.
\L...\Е - означает, что все символы в регулярном выражении между \L и \Е преобразуются в нижний регистр.
\U...\Е - означает, что все символы в регулярном выражении между \U и \Е преобразуются в верхний регистр.
\x - любой шестнадцатеричный символ
\< - начало слова, т. е. граница между символом, удовлетворяющим \W и символом, удовлетворяющим \w
\> - конец слова, т. е. граница между символом, удовлетворяющим \w и символом, удовлетворяющим \W
{,n} - повторить предыдущий символ от 0 до n раз

Примеры конструкций

.* - повтор любого символа, а значит весь текст
[ ... ] - одиночный символ множества, например [aeiou] - любой из строчных гласных
[^ ... ] - ни один из символов множества, например [^aeiou] - ни один из строчных гласных
[0-9A-Fa-f]{6} - Шестнадцатеричное число, например FF0000.
[А-яЁё] - Диапазон для русских букв. Или так [А-Яа-яЁё]
(\r\n|\r|\n){2,}, заменить на \1 - удаление пустых строк
(?<![А-яЁё])([А-яЁё]+) \1, заменить на \1 - удаление повторов слов
[A-ZА-ЯЁ]{2,}?[a-zа-яё]+ - выявит файлы, в которых есть ошибки вида "НАйти"- не преднамеренный повтор заглавной буквы
(.{35,}?[ ])(.*?), заменить на '$0' & @CRLF - где @CRLF символ переноса строки. Поставить флаг "Вычислить". Выполнить перенос строки на границе первого попавшегося пробела после каждых 35 символов.
(?si)(?:.*?)?(https?:\/\/[\w.:]+\/?(?:[\w\/?&=.~;\-+!*_#%])*) - найти ссылки
[A-Za-z0-9._-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}) - найти почтовые ящики

Ссылки

Учебники
Регулярные выражения. Дж. Фридл. 3-е издание, а также html
edlinsoft.blogspot.com - для .NET Framework, объяснение на примерах.
msdn.ru
php.ru, php.net
Управляющие символы (wiki)
ajaxforum.ru
Регулярные выражения на wiki
regexpstudio.com - Регулярные выражения для Delphi
docs.notepad-plus-plus.org - Официальный источник Notepad++ (англ. яз.)
pcre.org - Официальный справочник движка PCRE (англ. яз.)

Онлайн тестеры
regexr.com - здесь в Community множество готовых регулярных выражений
для javascript, для php (pagecolumn.com)
cuneytyilmaz.com - для javascript
php-include.ru -на флеш-плеере
regex101.com
easyregexp.ru
debuggex.com - показывает структурно

Программы для теста
RegexBuddy - крутая и платная
RegExp - бесплатно, AZJIO, PCRE, AutoIt3
Expresso
The Regex Coach