Negative Lookbehind
  /(?<!not )foo/
        not foo  -- no match
        but foo  -- match
            ^^^
            consumed and not visible to lookbehind

Negative Lookahead
  /foo(?! not)/
   foo not  -- no match
   foo bar  -- match
   ^^^
   consumed and not visible to lookahead


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

Введение

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

Простое сравнение

Любой символ совпадает с самим собой, если он не относится к специальным метасимволам описанным чуть ниже.
Последовательность символов совпадает с такой же последовательностью во входной строке, так что шаблон bluh совпадет с подстрокой bluh во входной строке.
Если необходимо, чтобы метасимволы или escape-последовательности воспринимались как обычные символы, их нужно предварять символом "\", например, метасимвол "^" обычно совпадает с началом строк, однако, если записать его как "\^", то он будет совпадать с символом ^, "\\" совпадает с \ и т.д.

 

Метасимволы

Метасимволы - это специальные символы, являющиеся важнейшим понятием в регулярных выражениях. Существует несколько групп метасимволов.

.любой символ в строке, а если включен модификатор s, то будет совпадать и с разделителями строк(\x0A и \x0D).
\Cлюбой однобайтовый символ. Используется для нахождения однобайтового знака в кодировках более одного байта. Например: UTF-8 или Юникод.
\xhhопределенный символ, где hh-шестнадцатеричный код символа
\x{hhh..}определенный символ, где hhh..-шестнадцатеричный код символа (только для UTF-8)
\0dddопределенный символ, где ddd-восьмеричный код символа
\tзнак табуляции (HT/TAB), можно также \x09
\nзнак разрыва строки (NL), можно также \x0A
\rзнак возврата каретки (CR), можно также \x0D
\fзнак перевода страницы (FF), можно также \x0C
\aзнак звукового сигнала (BEL), можно также \x07
\eзнак escape (ESC), можно также \x1B
\cXуправляющий символ - X

 

 

Метасимволы - перечни (любой знак из набора)

\wлюбой символ "слова"
\Wлюбой не \w
\dлюбой цифровой символ
\Dлюбой не \d
\sлюбой "пробельный" символ (по умолчанию - [ \t\n\r\f])
\Sлюбой не \s
[...]любой из символов в квадратных скобках
[^...]любой из символов кроме перечисленных в квадратных скобках
[...-...]любой символ в диапозоне
[:lower:]любая буква в нижнем регистре
[:upper:]любая буква в верхнем регистре
[:alpha:]любая буква
[:digit:]любая цифра, то же что \d
[:xdigit:]любой символ шестнадцатеричной цифры
[:alnum:]любая буква и цифра
[:word:]любой символ слова, то же что \w
[:ascii:]любой знак с кодом 0 - 127
[:blank:]пробел или табуляция
[:space:]любой "пробельный" знак, но не совсем то же что \s
[:cntrl:]любой управляющий знак
[:graph:]любой печатный знак, исключая пробел
[:print:]любой печатный знак, включая пробел
[:punct:]любой печатаемый знак, исключая буквы и цифры

Вы можете определить перечень, заключив символы в квабратные скобки - []. Перечень будет совпадать с любым одним символом перечисленным в нем.
Если первый символ перечня (сразу после [) - ^, то такой перечень совпадает с любым символом не перечисленным в перечне.

Внутри перечня символ - может быть использован для определения диапазонов символов, например [a-z] представляет все символы между 'a' и 'z', включительно.
Если Вам необходимо включить в перечень сам символ '-', поместите его в начало или конец перечня или предварите '\'. Если Вам необходимо поместить в перечень сам символ ']', поместите его в самое начало или предварите '\'.

Стандартные перечни \w, \d и \s можно использовать и внутри перечней символов.

На заметку

В программе на странице "Таблица и общие настройки" Вы легко можете переопределить перечнь символов для - \w, \W, \s, \S.

 

Метасимволы - разделители

\bСовпадает на границе слова
\BСовпадает не на границе слова
^начало строки
$конец строки
\Gпозиция начала или продолжения поиска в тексте
\Aначало текста
\Zпозиция поледнего разрыва строки в тексте
\zконец текста

Граница слова \b это точка между двумя символами, один из которых удовлетворяет \w, а другой - \W (в любом порядке), при этом перед началом и после конца строки подразумевается \W.
Метасимвол ^ по умолчанию совпадает только в начале входного текста, а метасимвол $ - только в конце текста. Внутренние разделители строк, имеющиеся в тексте, не будут совпадать с ^ и $.
Однако, если Вам необходимо работать с текстом как с многострочным, чтобы ^ совпадал после каждого разделителя строки внутри текста, а $ - перед каждым разделителем, то Вы можете включить модификатор m.
Метасимволы \A и \Z аналогичны ^ и $, но на них не действует модификатор m, т.е. они всегда совпадают только с началом и концом всего входного текста.

 

Метасимволы - повторители (Квантификаторы)

После любого элемента регулярного выражения может следовать очень важный тип метасимвола - повторитель. Используя их Вы можете определить число допустимых повторений предшествующего символа, метасимвола или выражения(группы).

?ноль или одно совпадение, то же что {0,1}
+одно или более совпадений, то же что {1,}?
*ноль или более совпадений, то же что {0,}
{n}точно n совпадений
{n,}не менее n совпадений
{n,m}не менее n, но не более m совпадений

Важно!
По умолчанию количество возвращаемых совпадений для любого квантификатора всегда стремится к максимально-возможному значению("жадный"). Эту особенность можно изменить, если добавить в конец квантификатора метасимвол - ?, то количество возвращаемых совпадений для данного квантификатора будет минимально-возможным значением("не жадный"). Если отключить глобальный модификатор - g, то все квантификаторы в шаблоне поиска будут возвращать минимально-возможные значения.
Небольшое пояснение по поводу "жадности". "Жадные" варианты повторителей пытаются захватить как можно большую часть входного текста, в то время как "не жадные" - как можно меньшую. Например, b+ как и b* примененные к входной строке 'abbbbc' найдут bbbb, в то время как b+? найдет только b, а b*? - вообще - пустую строку; b{2,3}? найдет bb, в то время как b{2,3} найдет bbb. Вы можете переключить все повторители в шаблоне поиска в "не жадный" режим, отключив модификатор g - (?-g).

 

Метасимволы - варианты

|Разделяет варианты поиска

Вы можете определить перечень вариантов, используя метасимвол | для их разделения, например fee|fie|foe найдет fee или fie или foe, (так же как f(e|i|o)e). В качестве первого варианта воспринимается все от предыдущего метасимвола ( или [ или от начала выражения до первого метасимвола |, в качестве последнего - все от последнего | до конца выражения или до ближайшего метасимвола ). Обычно, чтобы не запутаться, набор вариантов всегда заключают в скобки, даже если без этого можно было бы обойтись.
Варианты пробуются начиная с первого и попытки завершаются сразу же как удастся подобрать такой при котором совпадет вся последующая часть выражения. Это означает, что варианты не обязательно обеспечат "жадное" поведение. Например, если применить выражение foo|foot ко входной строке 'barefoot', то будет найдено foo так это первый вариант который позволил совпасть всему выражению.
Обратите внимание, что метасимвол | воспринимается как обычный символ внутри перечней символов, например, [fee|fie|foe] означает ровно то же самое что и [feio|].

 

Метасимволы - группировки регулярных выражений

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

(...)Задает выражение(группу)
(?P<Name>...)Задает выражение(группу) с именем-Name
(?>...)Задает элементарное(не учтенное) выражение(группу)
(?:...)Задает элементарное(не учтенное) выражение(группу)

Вы можете обратиться к любому не элементарному(Элементарное выражение не нумеруется, следовательно обращаться к нему бесполезно) выражению(группе) используя \n в строке Поиска или $n в строке Замены, где n - порядковый номер выражения(группы). Выражения нумеруются слева направо, в порядке появления открывающих скобок. Первое выражение имеет номер 1 (шаблон поиска в целом - 0, к нему можно обращаться только в строке Замены как $0 так и $&).
Выражение с именем, так же имеет свой порядковый номер. К выражению с именем можно обращаться как обычно по номеру, но в целях исключения ошибки, при подсчете номера, лучше обращаться по имени в строке Поиска - (?=Name) или в строке Замены - ${Name}, где Name - ранее присвоенное имя выражению(группе).
Важно! Для ускорения работы функции поиска необходимо применять в основном элементарные выражения и только по необходимости обычные выражения. Напрмер: шаблон поиска - (?:<|</)[[:ascii:]]+?(?:>| ) работает на ~45% быстрее, чем - (<|</)[[:ascii:]]+?(>| ).

Задав выражение внутри шаблона поиска Вы можете коренным образом изменить результаты поиска.

 

Метасимволы - условные выражения

Условные выражения ничего не возвращают и не нумеруются, но влияют на результат поиска. Это может потребоваться, когда необходимо найти что-то в определенном окружении.

(?=condition)Условный просмотр вперед, где condition - условное выражение
(?!condition)Условный просмотр вперед исключающий, где condition - условное выражение
(?<=condition)Условный просмотр назад, где condition - условное выражение, описывает текст
(?<!condition)Условный просмотр назад исключающий, где condition - условное выражение
(?(condition)yes-pattern)Условный поиск, где condition - логическое выражение, описывает текст от нахождения которого, зависит выполнение или невыполнение выражения поиска - yes-pattern.
(?(condition)yes-pattern|no-pattern)Условный поиск, где condition - логическое выражение, описывает текст от нахождения которого, зависит выполнение выражения поиска - yes-pattern или no-pattern.

 

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

\1..\nобратная ссылка на выражение(группу) с номером - n
(?=Name)обратная ссылка на выражение(группу) с именем - Name
(?R)рекурсивный вызов всего шаблона поиска

Метасимволы от \1 до \n воспринимаются как обратные ссылки.
\n совпадает с ранее найденным выражением с номером - n.

 

Метасимволы - изменения модификаторов поиска

(?...)включить модификатор(ы)
(?-...)выключить модификатор(ы)
(?...-...)включить модификатор(ы) и выключить модификатор(ы)

 

 

Метасимволы - комментария в строке поиска

Комментарий, просто игнорируется.

#метасимвол начала комментария до конца строки
(?#...)комментарий внутри строки поиска

Если встречается символ #, то символ '#' и все последующие символы до конца строки воспринимаются как комментарий.

Естественно, это означает что, если Вам нужно вставить в выражение пробел, табуляцию или разделитель строки или '#', то в расширенном x режиме это можно сделать только предваряя их '\' или используя \xhh (внутри перечней символов все эти символы воспринимаются как обычно).
Обратите внимание, что в комментарии такого вида - (?#text) невозможно поместить символ ")", поскольку он воспринимается как конец комментария.

 

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

Модификаторы служат для изменения режимов работы функции поиска.

i

Регистро-независимый режим (использует выбранный в ОС язык по умолчанию)

m

Воспринимать входной текст как многострочный, при этом метасимволы ^ и $ будут совпадать не только в начале и конце текста в целом, но и в начале и в конце всех имеющихся в тексте строк (см. также Разделители строк)

s

Метасимвол . (точка) - любой знак в тексте включая разрыв строки. Если этот модификатор выключен, то метасимвол . совпадает с любым символом только до конца строки.

x

заставляет функцию поиска игнорировать пробелы, табуляции и разделители строк, что позволяет форматировать текст шаблона поиска, чтобы обеспечить более легкую читаемость.

g

Не стандартный модификатор - искать до максимально-возможного совпадения("жадный"). Отключая его Вы переключаете все повторители в "не жадный" режим (по умолчанию этот модификатор включен). Т.е. если его отключить, то все + работают как +?, * как *? и т.д.

e

Не стандартный модификатор - искать до не пустого совпадения. Если включен, то функция поиска считается удачной, если может вернуть не пустое совпадение. К примеру шаблон поиска - \b\w*?\b обычно вернет только позицию границы слова, а если влючить модификатор - e, то вернет слово целиком.

a

Не стандартный модификатор - искать только совпадение от начала текста. Если включен, то поиск считается удачным, если искомое выражение находится в самом начале текста.

o

Не стандартный модификатор - искать до первого совпадения. Если включен, то поиск ведется только до первого сопадения.

n

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

 

ВНИМАНИЕ! Необходимо учитывать приоритет модификаторов

Начать использовать регулярные выражения на производстве и в быту