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 | Не стандартный модификатор - не нумеровать группы без имени. Если включен, то все обычные выражения без имени, в шаблоне поиска, преврашаются в элементарные. Применяется для усорения работы функции поиска и упрощает разработку регулярного выражения в целом. |
ВНИМАНИЕ! Необходимо учитывать приоритет модификаторов