Разное

Регулярные выражения w: Регулярные выражения для новичков

Содержание

Регулярные выражения для новичков

Что такое регулярные выражения?

Если вам когда-нибудь приходилось работать с командной строкой, вы, вероятно, использовали маски имён файлов. Например, чтобы удалить все файлы в текущей директории, которые начинаются с буквы «d», можно написать rm d*.

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

Реализация этого инструмента различается в разных языках программирования, хоть и не сильно. В данной статье мы будем ориентироваться в первую очередь на реализацию Perl Compatible Regular Expressions.

Основы синтаксиса

В первую очередь стоит заметить, что любая строка сама по себе является регулярным выражением. xyz] соответствует любой символ, кроме, собственно, «x», «y» или «z».

Итак, применяя данный инструмент к нашему случаю, если мы напишем [Хх][аоие]х[аоие], то каждая из строк «Хаха», «хехе», «хихи» и даже «Хохо» будут соответствовать шаблону.

Предопределённые классы символов

Для некоторых наборов, которые используются достаточно часто, существуют специальные шаблоны. Так, для описания любого пробельного символа (пробел, табуляция, перенос строки) используется \s, для цифр — \d, для символов латиницы, цифр и подчёркивания «_» — \w.

Если необходимо описать вообще любой символ, для этого используется точка — .. Если указанные классы написать с заглавной буквы (\S, \D, \W) то они поменяют свой смысл на противоположный — любой непробельный символ, любой символ, который не является цифрой, и любой символ кроме латиницы, цифр или подчёркивания соответственно. — начало текста, а $ — конец. Так, по паттерну \bJava\b в строке «Java and JavaScript» найдутся первые 4 символа, а по паттерну \bJava\B — символы c 10-го по 13-й (в составе слова «JavaScript»).

Комикс про регулярные выражения с xkcd.ru

Диапазоны

У вас может возникнуть необходимость обозначить набор, в который входят буквы, например, от «б» до «ф». Вместо того, чтобы писать [бвгдежзиклмнопрстуф] можно воспользоваться механизмом диапазонов и написать [б-ф]. Так, паттерну x[0-8A-F][0-8A-F] соответствует строка «xA6», но не соответствует «xb9» (во-первых, из-за того, что в диапазоне указаны только заглавные буквы, во-вторых, из-за того, что 9 не входит в промежуток 0-8).

Механизм диапазонов особенно актуален для русского языка, ведь для него нет конструкции, аналогичной \w. Чтобы обозначить все буквы русского алфавита, можно использовать паттерн [а-яА-ЯёЁ]. Обратите внимание, что буква «ё» не включается в общий диапазон букв, и её нужно указывать отдельно.

Квантификаторы

Вернёмся к нашему примеру. Что, если в «смеющемся» междометии будет больше одной гласной между буквами «х», например «Хаахаааа»? Наша старая регулярка уже не сможет нам помочь. Здесь нам придётся воспользоваться квантификаторами.

Примеры использования квантификаторов в регулярных выражениях

Обратите внимание, что квантификатор применяется только к символу, который стоит перед ним.

Некоторые часто используемые конструкции получили в языке регулярных выражений специальные обозначения:

Спецобозначения квантификаторов в регулярных выражениях.

Таким образом, с помощью квантификаторов мы можем улучшить наш шаблон для междометий до [Хх][аоеи]+х[аоеи]*, и он сможет распознавать строки «Хааха», «хееееех» и «Хихии».

Ленивая квантификация

Предположим, перед нами стоит задача — найти все HTML-теги в строке

<p><b>Tproger</b> — мой <i>любимый</i> сайт о программировании!</p>

Очевидное решение <. >]*>, которое запретит считать содержимым тега правую угловую скобку. Второй — объявить квантификатор не жадным, а ленивым. Делается это с помощью добавления справа к квантификатору символа ?. Т.е. для поиска всех тегов выражение обратится в <.*?>.

Ревнивая квантификация

Иногда для увеличения скорости поиска (особенно в тех случаях, когда строка не соответствует регулярному выражению) можно использовать запрет алгоритму возвращаться к предыдущим шагам поиска для того, чтобы найти возможные соответствия для оставшейся части регулярного выражения. Это называется ревнивой квантификацией. Квантификатор делается ревнивым с помощью добавления к нему справа символа +. Ещё одно применение ревнивой квантификации — исключение нежелательных совпадений. Так, паттерну ab*+a в строке «ababa» будут соответствовать только первые три символа, но не символы с третьего по пятый, т.к. символ «a», который стоит на третьей позиции, уже был использован для первого результата.

Скобочные группы

Для нашего шаблона «смеющегося» междометия осталась самая малость — учесть, что буква «х» может встречаться более одного раза, например, «Хахахахааахахооо», а может и вовсе заканчиваться на букве «х». Вероятно, здесь нужно применить квантификатор для группы [аиое]+х, но если мы просто напишем [аиое]х+, то квантификатор + будет относиться только к символу «х», а не ко всему выражению. Чтобы это исправить, выражение нужно взять в круглые скобки: ([аиое]х)+.

Таким образом, наше выражение превращается в [Хх]([аиое]х?)+ — сначала идёт заглавная или строчная «х», а потом произвольное ненулевое количество гласных, которые (возможно, но не обязательно) перемежаются одиночными строчными «х». Однако это выражение решает проблему лишь частично — под это выражение попадут и такие строки, как, например, «хихахех» — кто-то может быть так и смеётся, но допущение весьма сомнительное. Очевидно, мы можем использовать набор из всех гласных лишь единожды, а потом должны как-то опираться на результат первого поиска. Но как?…

Запоминание результата поиска по группе

Оказывается, результат поиска по скобочной группе записывается в отдельную ячейку памяти, доступ к которой доступен для использования в последующих частях регулярного выражения. Возвращаясь к задаче с поиском HTML-тегов на странице, нам может понадобиться не только найти теги, но и узнать их название. В этом нам может помочь регулярное выражение <(.*?)>.

<p><b>Tproger</b> — мой <i>любимый</i> сайт о программировании!</p>

Результат поиска по всему регулярному выражению: «<p>», «<b>», «</b>», «<i>», «</i>», «</p>».
Результат поиска по первой группе: «p», «b», «/b», «i», «/i», «/i», «/p».

На результат поиска по группе можно ссылаться с помощью выражения \n, где n — цифра от 1 до 9. Например выражению (\w)(\w)\1\2 соответствуют строки «aaaa», «abab», но не соответствует «aabb».

Если выражение берётся в скобки только для применения к ней квантификатора (не планируется запоминать результат поиска по этой группе), то сразу после первой скобки стоит добавить ?:, например (?:[abcd]+\w).

С использованием этого механизма мы можем переписать наше выражение к виду [Хх]([аоие])х?(?:\1х?)*.

Перечисление

Чтобы проверить, удовлетворяет ли строка хотя бы одному из шаблонов, можно воспользоваться аналогом булевого оператора OR, который записывается с помощью символа |. Так, под шаблон Анна|Одиночество попадают строки «Анна» и «Одиночество» соответственно. Особенно удобно использовать перечисления внутри скобочных групп. Так, например (?:a|b|c|d) полностью эквивалентно [abcd] (в данном случае второй вариант предпочтительнее в силу производительности и читаемости).

С помощью этого оператора мы сможем добавить к нашему регулярному выражению для поиска междометий возможность распознавать смех вида «Ахахаах» — единственной усмешке, которая начинается с гласной: [Хх]([аоие])х?(?:\1х?)*|[Аа]х?(?:ах?)+

Полезные сервисы

Потренироваться и / или проверить своё регулярное выражение на каком-либо тексте без написания кода можно с помощью таких сервисов, как RegExr, Regexpal или Regex101. script] вполне подходит символ «S».

Цвет

Напишите регулярное выражение для поиска HTML-цвета, заданного как #ABCDEF, то есть # и содержит затем 6 шестнадцатеричных символов.

Итак, нужно написать выражение для описания цвета, который начинается с «#», за которым следуют 6 шестнадцатеричных символов. Шестнадцатеричный символ можно описать с помощью [0-9a-fA-F]. Для его шестикратного повторения мы будем использовать квантификатор {6}.

#[0-9a-fA-F]{6}

Разобрать арифметическое выражение

Арифметическое выражение состоит из двух чисел и операции между ними, например:

  • 1 + 2
  • 1.2 *3.4
  • -3/ -6
  • -2-2

Список операций: «+», «-», «*» и «/».

Также могут присутствовать пробелы вокруг оператора и чисел.

Напишите регулярное выражение, которое найдёт как всё арифметическое действие, так и (через группы) два операнда.

Регулярное выражение для числа, возможно, дробного и отрицательного: -?\d+(\. \d+)?.

Оператор – это [+*/\-]. Заметим, что дефис мы экранируем. Нам нужно число, затем оператор, затем число, и необязательные пробелы между ними. Чтобы получить результат в требуемом формате, добавим ?: к группам, поиск по которым нам не интересен (отдельно дробные части), а операнды наоборот заключим в скобки. В итоге:

(-?\d+(?:\.\d+)?)\s*([-+*\/])\s*(-?\d+(?:\.\d+)?)

Кроссворды из регулярных выражений

Такие кроссворды вы можете найти у нас.


Удачи и помните — не всегда задачу стоит решать именно с помощью регулярных выражений («У программиста была проблема, которую он начал решать регэкспами. Теперь у него две проблемы»). Иногда лучше, например, написать развёрнутый автомат конечных состояний.

Задачи и их разборы с javascript.ru; в статье использованы комиксы xkcd.

Регулярные выражения (RegEx) — Документация TRegExpr 1.147

Вступление

Регулярные выражения — удобный способ описывать шаблоны текстов.

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

Ниже приведена исчерпывающая шпаргалка по регулярных выражениям всего на одной странице.

Символы

Простые совпадения

Серия символов соответствует этой серии символов во входной строке.

RegExНаходит
foobarfoobar

Непечатные символы (escape-коды)

Для представления непечатаемого символа в регулярном выражении используется \x с шестнадцатеричным кодом. Если код длиннее 2 цифр (более U+00FF), то он обрамляется в фигурные скобки.

RegExНаходит
\xABсимвол с 2-значным шестнадцатеричным кодом AB
\x{AB20}символ с 1-4 значным шестнадцатеричным кодом AB20
foo\x20barfoo bar (обратите внимание на пробел в середине)

Существует ряд предопределенных escape-кодов для непечатных символов, как в языке C:

RegExНаходит
\ttab (HT/TAB), тоже что \x09
\nсимвол новой строки (LF), то же что \x0a
\rвозврат каретки (CR), тоже что \x0d
\fform feed (FF), то же что \x0c
\aзвонок (BEL), тоже что \x07
\eescape (ESC), то же что \x1b
\cA\cZ

chr(0) по chr(25). aeiou]r

foobbr, foobcr и т. д., но не foobar, foober и т. д.

Внутри списка символ - используется для указания диапазона, так что a-z представляет все символы между a и z включительно.

Если вы хотите, чтобы - сам был членом класса, поместите его в начало или конец списка или предварите его обратной косой чертой (escape).

Если вы хотите буквально использовать символ ] поместите его в начало списка или escape обратной косой чертой.

RegExНаходит
[-az]a, z и -
[az-]a, z и -
[А\-z]a, z и -
[a-z]символы от a до z
[\n-\x0D]символы от #10 до #13

Разделители

Разделители строк

МетасимволНаходит
. .*$ не соответствует точке между \x0D\x0A, потому что это неразрывный разделитель строк. Но оно соответствует пустой строке в последовательности \x0A\x0D, поэтому из-за неправильного порядка кодов он не воспринимается как разделитель строк и считается просто двумя символами.

Примечание

TRegExpr

Многострочная обработка может быть настроена с помощью свойств LineSeparators и LinePairedSeparator.

Таким образом, вы можете использовать разделители стиля Unix \n или стиль DOS / Windows \r\n или смешивать их вместе (как описано выше по умолчанию).

Если вы предпочитаете математически правильное описание, вы можете найти его на сайте www.unicode.org.

Разделители слов

RegExНаходит
\bразделитель слов
\Bразделитель с не-словом

Граница слова \b — это точка между двумя символами, у которой \w с одной стороны от нее и \W с другой стороны (в любом порядке).

Повторы

Повтор

За любым элементом регулярного выражения может следовать допустимое число повторений элемента.

RegExНаходит
{n}ровно n раз
{n,}по крайней мере n раз
{n,m}по крайней мере n, но не более чем m раз
*ноль или более, аналогично {0,}
+один или несколько, похожие на {1,}
?ноль или единица, похожая на {0,1}

То есть цифры в фигурных скобках {n,m} определяются минимальное n и максимальное m количество повторов (совпадений во входном тексте).

{n} эквивалентно {n,n} и означает точно n раз. {n,} совпадает n или более раз.

Теоретически значение n и m не ограничены (можно использовать максимальное значение для 32-х битного числа).

RegExНаходит
foob.*rfoobar, foobalkjdflkj9r и foobr
foob.+rfoobar, foobalkjdflkj9r, но не foobr
foob.?rfoobar, foobbr и foobr, но не foobalkj9r
fooba{2}rfoobaar
fooba{2}rfoobaar, foobaaar, foobaaaar и т. д.
fooba{2,3}rfoobaar, или foobaaar, но не foobaaaar
(foobar){8,10}8, 9 или 10 экземпляров foobar (() это Группа)

Жадность

Повторы в жадном режиме захватывают как можно больше из входного текста, в не жадном режиме — как можно меньше.

По умолчанию все повторы являются жадными. Используйте ? Чтобы сделать любой повтор не жадным.

Для строки abbbbc:

RegExНаходит
b+bbbb
Ь+?b
b*?пустую строку
b{2,3}?bb
b{2,3}bbb

Вы можете переключить все повторы в не жадный режим (modifier /g, ниже мы используем in-line модификатор change).

RegExНаходит
(?-g)Ь+b

Сверхжадные повторы (Possessive Quantifier)

Синтаксис: a++, a*+, a?+, a{2,4}+. В настоящее время реализован только для простых групп и не будет работать для сложны, как например (foo|bar){3,5}+.

Полное описание (на английском) Вкратце, сверхжадный повтор ускоряет работу в сложных случаях.

Альтернативы

Выражения в списке альтернатив разделяются |.

Таким образом, fee|fie|foe будет соответствовать любому из fee, fie или foe (также как и f(e|i|o)e).

Первое выражение включает в себя все от последнего разделителя шаблона ((, [ или начало шаблона) до первого |, а последнее выражение содержит все от последнего | к следующему разделителю шаблона.

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

Выражения в списке альтернатив пробуются слева направо, принимается первое же совпадение.

Например, регулярное выражение foo|foot в строке barefoot будет соответствовать foo — первое же совпадение.

Также помните, что | в квадратных скобках воспринимается просто как символ, поэтому, если вы напишите [fee|fie|foe], это тоже самое что [feio|].

RegExНаходит
foo(bar|foo)foobar или foofoo

Группы (подвыражения)

Скобки (...) также могут использоваться для определения групп (подвыражений) регулярного выражения.

Примечание

TRegExpr

Позиция, длина и фактические значения подвыражений будут в MatchPos, MatchLen и Match.

Вы можете заменить их с помощью функции Substitute.

Подвыражения нумеруются слева направо по открывающим их скобкам (включая вложенные группы (подвыражения). У первой группы номер 1. У выражения в целом — 0.

Например, для входной строки foobar регулярное выражение (foo(bar)) найдет:

Группы (подвыражения)значение
0foobar
1foobar
2bar

Ссылки на группы (Backreferences)

Метасимволы от \1 до \9 интерпретируются как ссылки на группы (подвыражения в ()). \n соответствует ранее найденному подвыражению n.

RegExНаходит
(.)\1+aaaa и cc
(. +)\1+также abab и 123123

(['"]?)(\d+)\1 соответствует "13" (в двойных кавычках) или '4' (в одинарных кавычках) или 77 (без кавычек) и т. д.

Именованные группы (подвыражения) и ссылки на них

Чтобы присвоить имя группе используйте (?P<name>expr) или (?'name'expr).

Имя группы должно начинаться с буквы или _, далее следуют буквы, цифры или _. Именованные и не именованные группы имеют общую нумерацию от 1 до 9.

Чтобы сослаться на именованную группу используйте (?P=name). Или, как и для не именованных, цифры от \1 до \9.

RegExНаходит
(?P<qq>['"])\w+(?P=qq)"word" и 'word'

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

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

Смотрите также Разделители строк.

s, одиночные строки

Обрабатывать строку как одну строку. Так что . соответствует любому символу, даже разделителям строк.

Смотрите также Разделители строк, которые обычно не совпадают.

г, жадность

Примечание

Специфичный для TRegExpr модификатор.

Отключив его Off, вы переключите повторитель в не-жадный режим.

Итак, если модификатор /g имеет значение Off, то + работает как +?, * как *? и так далее.

По умолчанию этот модификатор имеет значение Выкл.

x, расширенный синтаксис

Позволяет комментировать регулярные выражения и разбивать их на несколько строк.

Если модификатор включен, мы игнорируем все пробелы, которые не заэскейплены обратной косой чертой, и не включены в класс символов.

Также символ # отделяет комментарии.

Обратите внимание, что вы можете использовать пустые строки для форматирования регулярного выражения для лучшей читаемости:

(
(abc) # комментарий 1
#
(efg) # комментарий 2
)

Это также означает, что если вам нужно вставить пробел или символ # в шаблон (вне класса символов, где они не затрагиваются /x), вам придется либо эскейпить их, либо кодировать, используя шестнадцатеричный код.

г, русские диапазоны

Примечание

Специфичный для TRegExpr модификатор.

В русской таблице ASCII символы ё / Ё размещаются отдельно от других.

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

С этим модификатором вместо [а-яА-ЯёЁ] вы можете написать [а-Я], если вам нужны все русские символы.

Когда модификатор включен:

RegExНаходит
а-ясимволы от а до я и ё
А-Ясимволы от А до Я и Ё
а-Явсе русские символы

Модификатор по умолчанию установлен на Вкл.

Проверки или заглядывания вперед и назад (Assertions)

Заглядывание вперед (lookahead assertion) foo(?=bar) совпадает «foo» только перед «bar», при этом сама строка «bar» не войдет в найденный текст.

Отрицательное заглядывание вперед (negative lookahead assertion): foo(?!bar) совпадает «foo» только если после этой строки не следует «bar».

Ретроспективная проверка (lookbehind assertion): (?<=foo)bar совпадает «bar» только после «foo», при этом сама строка «foo» не войдет в найденный текст.

Отрицательное заглядывание вперед (negative lookahead assertion): foo(?!bar) совпадает «bar» только если перед этой строки нет «foo».

Ограничения:

  • Скобки для заглядываний вперед должны быть в самом начале выражения. Не поддерживаются заглядывания внутри альтернатив (|) или групп.
  • Для заглядывания назад (?<!foo)bar, выражение «foo» должно быть фиксированной длины. Допустимы повторы только с фиксированным числом {n} или {n,n}. Разрешено использование классов символов и точки. Не разрешены группы и альтернативы.
  • Для остальных трех типов заглядываний, выражение в скобках может быть сколь угодно сложным.

Не захватываемые группы (подвыражения)

Синтаксис: (?:subexpression).

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

RegExНаходит
(https?|ftp)://([^/\r\n]+)в https://sorokin. /\r\n]+)в https://sorokin.engineer захватит только sorokin.engineer

Атомарные группы

Синтаксис: (?>expr|expr|...).

Атомарные группы это специальный случай незахватывающих групп. Подробнее

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

Синтаксис для одного модификатора: (?i) чтобы включить, и (?-i) чтобы выключить. Для большого числа модификаторов используется синтаксис: (?msgxr-imsgxr).

Можно использовать внутри регулярного выражения. Это может быть особенно удобно, поскольку оно имеет локальную область видимости. Оно влияет только на ту часть регулярного выражения, которая следует за оператором (?imsgxr-imsgxr).

И если оно находится внутри подвыражения, оно будет влиять только на это подвыражение, а именно на ту часть подвыражения, которая следует за оператором. Таким образом, в ((?i)Saint)-Petersburg это влияет только на подвыражение ((?i)Saint), поэтому оно будет соответствовать saint-Petersburg, но не saint-petersburg.

RegExНаходит
(?i)Saint-PetersburgSaint-petersburg и Saint-Petersburg
(?i)Saint-(?-i)PetersburgSaint-Petersburg, но не Saint-petersburg
(?i)(Saint-)?PetersburgSaint-petersburg и saint-petersburg
((?i)Saint-)?Petersburgsaint-Petersburg, но не saint-petersburg

Рекурсия

Синтаксис (?R), синоним (?0).

Выражение a(?R)?z совпадает с одним или более символом «a» за которым следует точно такое же число символов «z».

Основное назначение рекурсии — сбалансировать обрамление вложенного текста. Общий вид b(?:m|(?R))*e где «b» это то что начинает обрамляемый текст, «m» это собственно текст, и «e» это то, что завершает обрамление.

Если же обрамляемый текст также может встречаться без обрамления то выражение будет b(?R)*e|m.

Вызовы подвыражений

Нумерованные группы (подвыражения) обозначают (?1)(?90) (максимальное число групп определяется константой в TRegExpr).

Синтаксис для именованных групп : (?P>name). Поддерживается также Perl вариант синтаксиса: (?&name).

Это похоже на рекурсию, но повторяет только указанную группу (подвыражение).

Unicode категории (category)

В стандарте Unicode есть именованные категории символов (Unicode category). Категория обозначается одной буквой, и еще одна добавляется, чтобы указать подкатегорию. Например «L» это буква в любом регистре, «Lu» — буквы в верхнем регистре, «Ll» — в нижнем.

  • Cc — Control
  • Cf — Формат
  • Co — Частное использование
  • Cs — Заменитель (Surrrogate)
  • Ll — Буква нижнего регистра
  • Lm — Буква-модификатор
  • Lo — Прочие буквы
  • Lt — Titlecase Letter
  • Lu — Буква в верхнем регистре
  • Mc — Разделитель
  • Me — Закрывающий знак (Enclosing Mark)
  • Mn — Несамостоятельный символ, как умляут над буквой (Nonspacing Mark)
  • Nd — Десятичная цифра
  • Nl — Буквенная цифра — например, китайская, римская, руническая и т. д. (Letter Number)
  • No — Другие цифры
  • Pc — Connector Punctuation
  • Pd — Dash Punctuation
  • Pe — Close Punctuation
  • Pf — Final Punctuation
  • Pi — Initial Punctuation
  • Po — Other Punctuation
  • Ps — Open Punctuation
  • Sc — Currency Symbol
  • Sk — Modifier Symbol
  • Sm — Математический символ
  • So — Прочие символы
  • Zl — Разделитель строк
  • Zp — Разделитель параграфов
  • Zs — Space Separator

Метасимвол \p это один символ указанной Unicode категории (category). Синтаксис: \pL или \p{L} если категория обозначается одним символом, \p{Lu} для 2-символьных категорий.

Метасимвол \P это символ не из Unicode категории (category).

Эти метасимволы также поддерживаются внутри пользовательских классов.

Элементы языка регулярных выражений — краткий справочник



  • Чтение занимает 5 мин

В этой статье

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

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

Мы также представили эту информацию в двух форматах, чтобы вы могли ее скачать и распечатать для справки:

Escape-знаки

Обратная косая черта (\) в регулярных выражениях указывает, что следующий за ней символ либо является специальным знаком (как показано в следующей таблице), либо должен интерпретироваться буквально. Дополнительные сведения см. в разделе Escape-символы.

Escape-символОписаниеШаблонЧисло соответствий
\aСоответствует знаку колокольчика, \u0007.\a"\u0007" в "Error!" + '\u0007'
\bВ классе символов соответствует знаку BACKSPACE, \u0008.[\b]{3,}"\b\b\b\b" в "\b\b\b\b"
\tСоответствует знаку табуляции, \u0009.(\w+)\t"item1\t", "item2\t" в "item1\titem2\t"
\rСоответствует знаку возврата каретки, \u000D. (\r не эквивалентен знаку начала новой строки, \n.)\r\n(\w+)"\r\nThese" в "\r\nThese are\ntwo lines."
\vСоответствует знаку вертикальной табуляции, \u000B.[\v]{2,}"\v\v\v" в "\v\v\v"
\fСоответствует знаку перевода страницы, \u000C.[\f]{2,}"\f\f\f" в "\f\f\f"
\nСоответствует знаку новой строки, \u000A.\r\n(\w+)"\r\nThese" в "\r\nThese are\ntwo lines."
\eСоответствует escape-знаку, \u001B.\e"\x001B" в "\x001B"
\ nnnИспользует восьмеричное представление для указания символа (nnn состоит из двух или трех цифр).\w\040\w"a b", "c d" в "a bc d"
\x nnИспользует шестнадцатеричное представление для указания символа (nn состоит ровно из двух цифр).\w\x20\w"a b", "c d" в "a bc d"
\c X

\c x

Соответствует управляющему символу ASCII, который задан как X или x, где X или x является буквой управляющего символа.\cC"\x0003" в "\x0003" (Ctrl-C)
\u nnnnСовпадение со знаком Юникода в шестнадцатеричном представлении (строго четыре цифры, представленные как nnnn).\w\u0020\w"a b", "c d" в "a bc d"
\Если за этим знаком следует символ, не распознанный как escape-символ из этой и других таблиц данной темы, то соответствует в точности этому символу. Например, \* — это то же самое, что и \x2A, а \. — то же самое, что и \x2E. Это позволяет обработчику регулярных выражений распознавать языковые элементы (такие как *или ?) и символьные литералы (представленные как \* или \?).\d+[\+-x\*]\d+"2+2" и "3*9" в "(2+2) * 3*9"

Классы символов

Класс символов соответствует какому-либо одному набору символов. Классы символов состоят из языковых элементов, приведенных в следующей таблице. Дополнительные сведения см. в разделе Классы символов.

Класс знаковОписаниеШаблонЧисло соответствий
[ character_group ]Соответствует любому одиночному символу, входящему в character_group. По умолчанию при сопоставлении учитывается регистр.[ae]"a" в "gray"

"a", "e" в "lane"

[^ character_group ]Отрицание: соответствует любому одиночному символу, не входящему в character_group. aei]"r", "g", "n" в "reign"
[ first - last ]Диапазон символов: соответствует одному символу в диапазоне от первого до последнего.[A-Z]"A", "B" в "AB123"
.Подстановочный знак: соответствует любому одиночному символу, кроме \n.

Для сопоставления символа точки (. или \u002E) перед ней нужно поставить дополнительную обратную косую черту (\.).

a.e"ave" в "nave"

"ate" в "water"

\p{ имя }Соответствует любому одиночному символу в общей категории Юникода или в именованном блоке, указанном в параметре имя.\p{Lu}

\p{IsCyrillic}

"C", "L" в "City Lights"

"Д", "Ж" в "ДЖem"

\P{ имя }Соответствует любому одиночному символу, не входящему в общую категорию Юникода или в именованный блок, указанный в параметре имя.\P{Lu}

\P{IsCyrillic}

"i", "t", "y" в "City"

"e", "m" в "ДЖem"

\wСоответствует любому алфавитно-цифровому знаку.\w"I", "D", "A", "1", "3" в "ID A1.3"
\WСоответствует любому символу, который не является буквенно-цифровым знаком.\W" ", "." в "ID A1.3"
\sСоответствует любому знаку пробела.\w\s"D " в "ID A1.3"
\SСоответствует любому знаку, не являющемуся пробелом.\s\S" _" в "int __ctr"
\dСоответствует любой десятичной цифре. \d{3}"901" в "901-333-"
$По умолчанию соответствие должно обнаруживаться в конце строки или перед символом \n в конце строки. В многострочном режиме соответствие должно обнаруживаться до конца линии или перед символом \n в конце линии.-\d{3}$"-333" в "-901-333"
\AСоответствие должно обнаруживаться в начале строки.\A\d{3}"901" в "901-333-"
\ZСоответствие должно обнаруживаться в конце строки или до символа \n в конце строки.-\d{3}\Z"-333" в "-901-333"
\zСоответствие должно обнаруживаться в конце строки.-\d{3}\z"-333" в "-901-333"
\GСоответствие должно обнаруживаться в той точке, где заканчивается предыдущее соответствие.\G\(\d\)"(1)", "(3)", "(5)" в "(1)(3)(5)[7](9)"
\bСоответствие должно обнаруживаться на границе между символом \w (алфавитно-цифровым) и символом \W (не алфавитно-цифровым).\b\w+\s\w+\b"them theme", "them them" в "them theme them them"
\BСоответствие не должно обнаруживаться на границе \b.\Bend\w*\b"ends", "ender" в "end sends endure lender"

Конструкции группирования

Конструкции группирования отображают части выражений регулярных выражений и обычно захватывают части строки входной строки. Конструкции группирования состоят из языковых элементов, приведенных в следующей таблице. Для получения дополнительной информации см. Конструкции группирования.

Конструкция группированияОписаниеШаблонЧисло соответствий
( subexpression )Захватывает соответствующую часть выражения и назначает ей порядковый номер, отсчитываемый от единицы.(\w)\1"ee" в "deep"
(?< name > subexpression )
или
(?' name ' subexpression )
Выделяет соответствующую часть выражения в именованную группу.(?<double>\w)\k<double>"ee" в "deep"
(?< name1 - name2 > subexpression )
или
(?' name1 - name2 ' subexpression )
Задает сбалансированное определение группы. ((1-3)*(3-1))»
(?: subexpression )Определяет невыделяемую группу.Write(?:Line)?"WriteLine" в "Console.WriteLine()"

"Write" в "Console.Write(value)"

(?imnsx-imnsx: subexpression )Применяет или отключает указанные параметры в части выражения. Для получения дополнительной информации см. Параметры регулярных выражений.A\d{2}(?i:\w+)\b"A12xl", "A12XL" в "A12xl A12XL a12xl"
(?= subexpression )Утверждение положительного просмотра вперед нулевой ширины.\w+(?=\.)"is", "ran" и "out" в "He is. The dog ran. The sun is out."
(?! subexpression )Утверждение отрицательного просмотра вперед нулевой ширины.\b(?!un)\w+\b"sure", "used" в "unsure sure unity used"
(?<= subexpression )Утверждение положительного просмотра назад нулевой ширины.(?<=19)\d{2}\b"99", "50", "05" в "1851 1999 1950 1905 2003"
(?<! subexpression )Утверждение отрицательного просмотра назад нулевой ширины.(?<!19)\d{2}\b"51", "03" в "1851 1999 1950 1905 2003"
(?> subexpression )Атомарная группа.[13579](?>A+B+)"1ABB", "3ABB" и "5AB" в "1ABB 3ABBC 5AB 5AC"

Квантификаторы

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

КвантификаторОписаниеШаблонЧисло соответствий
*Соответствует предыдущему элементу ноль или более раз.\d*\.\d".0", "19.9", "219.9"
+Соответствует предыдущему элементу один или более раз."be+""bee" в "been", "be" в "bent"
?Соответствует предыдущему элементу ноль или один раз."rai?n""ran", "rain"
{ n }Предыдущий элемент повторяется ровно n раз.",\d{3}"",043" в "1,043. 6", ",876", ",543" и ",210" в "9,876,543,210"
{ n ,}Предыдущий элемент повторяется как минимум n раз."\d{2,}""166", "29", "1930"
{ n , m }Предыдущий элемент повторяется как минимум n раз, но не более чем m раз."\d{3,5}""166", "17668"

"19302" в "193024"

*?Предыдущий элемент не повторяется вообще или повторяется, но как можно меньшее число раз.\d*?\.\d".0", "19.9", "219.9"
+?Предыдущий элемент повторяется один или несколько раз, но как можно меньшее число раз."be+?""be" в "been", "be" в "bent"
??Предыдущий элемент не повторяется или повторяется один раз, но как можно меньшее число раз."rai??n""ran", "rain"
{ n }?Предыдущий элемент повторяется ровно n раз.",\d{3}?"",043" в "1,043.6", ",876", ",543" и ",210" в "9,876,543,210"
{ n ,}?Предыдущий элемент повторяется как минимум n раз (как можно меньше)."\d{2,}?""166", "29", "1930"
{ n , m }?Предыдущий элемент повторяется не менее n и не более m раз (как можно меньше)."\d{3,5}?""166", "17668"

"193", "024" в "193024"

Конструкции обратных ссылок

Обратная ссылка позволяет впоследствии идентифицировать ранее найденную соответствующую часть выражения в том же регулярном выражении. В следующей таблице перечислены конструкции обратных ссылок, поддерживаемые регулярными выражениями .NET. Для получения дополнительной информации см. Конструкции обратных ссылок.

Конструкция обратных ссылокОписаниеШаблонЧисло соответствий
\ числоОбратная ссылка. Соответствует значению нумерованной части выражения.(\w)\1"ee" в "seek"
\k< имя >Именованная обратная ссылка. Соответствует значению именованного выражения.(?<char>\w)\k<char>"ee" в "seek"

Конструкции чередования

Конструкции изменения модифицируют регулярное выражение, включая сопоставление по принципу «либо-либо». Такие конструкции состоят из языковых элементов, приведенных в следующей таблице. Дополнительные сведения см. в разделе Конструкции чередования.

Конструкция измененияОписаниеШаблонЧисло соответствий
|Соответствует любому элементу, разделенному вертикальной чертой (|).th(e|is|at)"the", "this" в "this is the day."
(?( expression ) yes | no )Соответствует да в случае соответствия шаблона регулярного выражения, определяемого выражением; в противном случае соответствует дополнительной части нет. Выражение интерпретируется как утверждение нулевой ширины.(?(A)A\d{2}\b|\b\d{3}\b)"A10", "910" в "A10 C103 910"
(?( name ) yes | no )Соответствует да в случае соответствия именованной или нумерованной группы захвата имя; в противном случае соответствует дополнительной части нет.(?<quoted>")?(?(quoted).+?"|\S+\s)"Dogs.jpg ", "\"Yiska playing.jpg\"" в "Dogs.jpg \"Yiska playing.jpg\""

Подстановки

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

ЗнакОписаниеШаблонШаблон заменыВходная строкаРезультирующая строка
$ числоЗамещает часть строки, соответствующую группе число.\b(\w+)(\s)(\w+)\b$3$2$1"one two""two one"
${ имя }Замещает часть строки, соответствующую именованной группе имя.\b(?<word1>\w+)(\s)(?<word2>\w+)\b${word2} ${word1}"one two""two one"
$$Подставляет литерал «$».\b(\d+)\s?USD$$$1"103 USD""$103"
$&Замещает копией полного соответствия.\$?\d*\.?\d+**$&**"$1.30""**$1.30**"
$` Замещает весь текст входной строки до соответствия.B+$` "AABBCC""AAAACC"
$'Замещает весь текст входной строки после соответствия.B+$'"AABBCC""AACCCC"
$+Замещает последнюю захваченную группу.B+(C+)$+"AABBCCDD""AACCDD"
$_Замещает всю входную строку.B+$_"AABBCC""AAAABBCCCC"

Параметры регулярных выражений

Можно определить параметры, управляющие интерпретацией шаблона регулярного выражения обработчиком регулярных выражений. Многие из этих параметров можно указать в шаблоне регулярного выражения либо в виде одной или нескольких констант RegexOptions. Этот краткий справочник перечисляет только встраиваемые параметры. Дополнительные сведения о встроенных параметрах и параметрах RegexOptions см. в статье Параметры регулярных выражений.

Встроенный параметр можно задать двумя способами:

  • С помощью прочих конструкций (?imnsx-imnsx), где минус (-) перед параметром или набором параметров отключает эти параметры. Например, (?i-mn) включает сопоставление без учета регистра (i), отключает многострочный режим (m) и отключает захват неименованных групп (n). Параметр применяется к шаблону регулярного выражения от точки, в которой определен параметр, и действует либо до конца шаблона, либо до точки, в которой другая конструкция отменяет параметр.
  • С помощью конструкции группирования(?imnsx-imnsx:часть выражения), которая определяет параметры для только для указанной группы.

Механизм регулярных выражений .NET поддерживает следующие встроенные параметры:

ПараметрОписаниеШаблонЧисло соответствий
iИспользовать соответствие без учета регистра. и $ соответствуют началу и концу строки (line), а не началу и концу строки (string).Пример см. в подразделе «Многострочный режим» раздела Параметры регулярных выражений.
nНе захватывать неименованные группы.Пример см. в подразделе «Только явные захваты» раздела Параметры регулярных выражений.
sИспользовать однострочный режим.Пример см. в подразделе «Однострочный режим» раздела Параметры регулярных выражений.
xИгнорировать знаки пробела в шаблоне регулярного выражения, не преобразованные в escape-последовательность.\b(?x) \d+ \s \w+"1 aardvark", "2 cats" в "1 aardvark 2 cats IV centurions"

Прочие конструкции

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

КонструкцияОпределениеПример
(?imnsx-imnsx)Устанавливает или отключает такие параметры, как учет регистра в середине шаблона. Дополнительные сведения см. в статье Параметры регулярных выражений.\bA(?i)b\w+\b соответствует "ABA", "Able" в "ABA Able Act"
(?# comment )Встроенное примечание. Примечание заканчивается первой закрывающей скобкой.\bA(?#Matches words starting with A)\w+\b
# [до конца строки]Комментарий режима X. Примечание начинается от знака # без обратной косой черты и продолжается до конца строки.(?x)\bA\w+\b#Matches words starting with A

См.

Привет пока$ точное совпадение (начинается и заканчивается как Привет пока)воробушки соответствует любой строке, в которой есть текст воробушки

Квантификаторы — * + ? и {}

abc*       соответствует строке, в которой после ab следует 0 или более символов c -> тестabc+       соответствует строке, в которой после ab следует один или более символов cabc?       соответствует строке, в которой после ab следует 0 или один символ cabc{2}     соответствует строке, в которой после ab следует 2 символа cabc{2,}    соответствует строке, в которой после ab следует 2 или более символов cabc{2,5}   соответствует строке, в которой после ab следует от 2 до 5 символов ca(bc)*     соответствует строке, в которой после ab следует 0 или более последовательностей символов bca(bc){2,5} соответствует строке, в которой после ab следует от 2 до 5 последовательностей символов bc

Оператор ИЛИ — | или []

a(b|c) соответствует строке, в которой после a следует b или c -> тестa[bc]  как и в предыдущем примере

Символьные классы — \d \w \s и .

\d соответствует одному символу, который является цифрой -> тест\w соответствует слову (может состоять из букв, цифр и подчёркивания) -> тест\s соответствует символу пробела (включая табуляцию и прерывание строки). соответствует любому символу -> тест

Используйте оператор . с осторожностью, так как зачастую класс или отрицаемый класс символов (который мы рассмотрим далее) быстрее и точнее.

У операторов \d, \w и \s также есть отрицания ― \D, \W и \S соответственно.

Например, оператор \D будет искать соответствия противоположенные \d.

\D соответствует одному символу, который не является цифрой -> тест

Некоторые символы, например ^. и $ вызовут совпадение в начале и конце строки ввода (line), вместо строки целиком (string).

  • i (insensitive) ― делает выражение регистронезависимым (например, /aBc/i соответствует AbC).
  • Шпаргалка по регулярным выражениям — Exlab


    Шпаргалка представляет собой общее руководство по шаблонам регулярных выражений без учета специфики какого-либо языка. Она представлена в виде таблицы, помещающейся на одном печатном листе формата A4. Создана под лицензией Creative Commons на базе шпаргалки, автором которой является Dave Child (подробнее).


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


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

    Символьные классы в регулярных выражениях соответствуют сразу некоторому набору символов. Например, \d соответствует любой цифре от 0 до 9 включительно, \w соответствует буквам и цифрам, а \W — всем символам, кроме букв и цифр. Шаблон, идентифицирующий буквы, цифры и пробел, выглядит так:

    \w\s


    POSIX

    POSIX — это относительно новое дополнение семейства регулярных выражений. Идея, как и в случае с символьными классами, заключается в использовании сокращений, представляющих некоторую группу символов.


    Утверждения

    Поначалу практически у всех возникают трудности с пониманием утверждений, однако познакомившись с ними ближе, вы будете использовать их довольно часто. Утверждения предоставляют способ сказать: «я хочу найти в этом документе каждое слово, включающее букву “q”, за которой не следует “werty”».\s]*).


    Образцы шаблонов

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


    Кванторы

    Кванторы позволяют определить часть шаблона, которая должна повторяться несколько раз подряд. Например, если вы хотите выяснить, содержит ли документ строку из от 10 до 20 (включительно) букв «a», то можно использовать этот шаблон:

    a{10,20}

    По умолчанию кванторы — «жадные». Поэтому квантор +, означающий «один или больше раз», будет соответствовать максимально возможному значению. Иногда это вызывает проблемы, и тогда вы можете сказать квантору перестать быть жадным (стать «ленивым»), используя специальный модификатор. Посмотрите на этот код:

    ".*"

    Этот шаблон соответствует тексту, заключенному в двойные кавычки. Однако, ваша исходная строка может быть вроде этой:

    <a href="helloworld.htm" title="Привет, Мир">Привет, Мир</a>

    Приведенный выше шаблон найдет в этой строке вот такую подстроку:

    "helloworld.htm" title="Привет, Мир"

    Он оказался слишком жадным, захватив наибольший кусок текста, который смог.

    ".*?"

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

    "helloworld.htm"
    "Привет, Мир"


    Специальные символы

    Регулярные выражения используют некоторые символы для обозначения различных частей шаблона. Однако, возникает проблема, если вам нужно найти один из таких символов в строке, как обычный символ. Точка, к примеру, в регулярном выражении обозначает «любой символ, кроме переноса строки». Если вам нужно найти точку в строке, вы не можете просто использовать «.» в качестве шаблона — это приведет к нахождению практически всего. Итак, вам необходимо сообщить парсеру, что эта точка должна считаться обычной точкой, а не «любым символом». Это делается с помощью знака экранирования.

    Знак экранирования, предшествующий символу вроде точки, заставляет парсер игнорировать его функцию и считать обычным символом. Есть несколько символов, требующих такого экранирования в большинстве шаблонов и языков. Вы можете найти их в правом нижнем углу шпаргалки («Мета-символы»).

    Шаблон для нахождения точки таков:

    \.

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


    Подстановка строк

    Подстановка строк подробно описана в следующем параграфе «Группы и диапазоны», однако здесь следует упомянуть о существовании «пассивных» групп. Это группы, игнорируемые при подстановке, что очень полезно, если вы хотите использовать в шаблоне условие «или», но не хотите, чтобы эта группа принимала участие в подстановке.


    Группы и диапазоны

    Группы и диапазоны очень-очень полезны. Вероятно, проще будет начать с диапазонов. Они позволяют указать набор подходящих символов. Например, чтобы проверить, содержит ли строка шестнадцатеричные цифры (от 0 до 9 и от A до F), следует использовать такой диапазон:

    [A-Fa-f0-9]

    Чтобы проверить обратное, используйте отрицательный диапазон, который в нашем случае подходит под любой символ, кроме цифр от 0 до 9 и букв от A до F:

    [^A-Fa-f0-9]

    Группы наиболее часто применяются, когда в шаблоне необходимо условие «или»; когда нужно сослаться на часть шаблона из другой его части; а также при подстановке строк.

    Использовать «или» очень просто: следующий шаблон ищет «ab» или «bc»:

    (ab|bc)

    Если в регулярном выражении необходимо сослаться на какую-то из предшествующих групп, следует использовать \n, где вместо n подставить номер нужной группы. Вам может понадобиться шаблон, соответствующий буквам «aaa» или «bbb», за которыми следует число, а затем те же три буквы. Такой шаблон реализуется с помощью групп:

    (aaa|bbb)[0-9]+\1

    Первая часть шаблона ищет «aaa» или «bbb», объединяя найденные буквы в группу. За этим следует поиск одной или более цифр ([0-9]+), и наконец \1. Последняя часть шаблона ссылается на первую группу и ищет то же самое. Она ищет совпадение с текстом, уже найденным первой частью шаблона, а не соответствующее ему. Таким образом, «aaa123bbb» не будет удовлетворять вышеприведенному шаблону, так как \1 будет искать «aaa» после числа.A-Za-z0-9])

    Он найдет любые вхождения слова «wish» вместе с предыдущим и следующим символами, если только это не буквы или цифры. Тогда ваша подстановка может быть такой:

    $1<b>$2</b>$3

    Ею будет заменена вся найденная по шаблону строка. Мы начинаем замену с первого найденного символа (который не буква и не цифра), отмечая его $1. Без этого мы бы просто удалили этот символ из текста. То же касается конца подстановки ($3). В середину мы добавили HTML тег для жирного начертания (разумеется, вместо него вы можете использовать CSS или <strong>), выделив им вторую группу, найденную по шаблону ($2).


    Модификаторы шаблонов

    Модификаторы шаблонов используются в нескольких языках, в частности, в Perl. Они позволяют изменить работу парсера. Например, модификатор i заставляет парсер игнорировать регистры.

    Регулярные выражения в Perl обрамляются одним и тем же символом в начале и в конце. Это может быть любой символ (чаще используется «/»), и выглядит все таким образом:

    /pattern/

    Модификаторы добавляются в конец этой строки, вот так:

    /pattern/i


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

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

    \(


    Рекомендуем также:

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

    При поиске и создании правил сегментации используются регулярные выражения, поддерживаемые платформой Java. Более подробную
    информацию можно найти в документации Java. Ниже приведены несколько примеров и ссылок.

    Примечание

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

    Таблица 16.1. Регулярные выражения — Модификаторы

    Выражение… соответствует
    (?i)Включает поиск совпадений независимо от регистра символов (по умолчанию все шаблоны чувствительны к регистру)

    Таблица 16.2. Регулярные выражения — Символы

    Выражение… соответствует
    xСимвол «x», за исключением следующих случаев…
    \uhhhhСимвол с шестнадцатеричным значением 0xhhhh
    \tСимвол табуляции («\u0009»)
    \nСимвол новой строки («\u000A»)
    \rСимвол возврата каретки («\u000D»)
    \fСимвол конца страницы (команда подачи страницы для принтера) («\u000C»)
    \aСимвол звонка (оповещения) («\u0007»)
    \eСимвол Escape («\u001B»)
    \cxУправляющий символ, соответствующий «x»
    \0nСимвол с восьмеричным значением 0n (0 ≤ n ≤ 7)
    \0nnСимвол с восьмеричным значением 0nn (0 ≤ n ≤ 7)
    \0mnnСимвол с восьмеричным значением 0mnn (0 ≤ m ≤ 3, 0 ≤ n ≤ 7)
    \xhhСимвол с шестнадцатеричным значением 0xhh

    Таблица 16.{|}
    в качестве их буквальных значений.

    \\Например, это будет обратная косая черта.
    \Qне соответствует ничему, только экранирует все символы вплоть до \E
    \Eне соответствует ничему, только прекращает экранирование, начатое \Q

    Таблица 16.4. Регулярные выражения — Классы блоков и категорий Юникода

    Выражение… соответствует
    \p{InGreek}Символ из греческого блока (простой блок)
    \p{Lu}Прописная буква (см.abc]Любой символ кроме a, b, или c (исключение)
    [a-zA-Z]Любые символы латинского алфавита, от a до z и от A до Z включительно

    Таблица 16.6. Регулярные выражения — Предустановленные наборы символов

    Выражение… соответствует
    .Любой символ (кроме символов конца строки)
    \dЦифра: [0-9]
    \DНе цифра: [^0-9]
    \sЛюбой пробельный символ: [ \t\n\x0B\f\r]
    \SЛюбой не пробельный символ: [^\s]
    \wЛюбой буквенный или цифровой символ, а также знак подчёркивания: [a-zA-Z_0-9]
    \WЛюбой символ кроме буквенного и цифрового, а также знака подчёркивания: [^\w]

    Таблица 16.Начало строки$Конец строки\bГраница слова\BНе граница слова

    Таблица 16.8. Регулярные выражения — Жадные кванторы

    Выражение… соответствует
    X?X, один раз или ни разу
    X*X, ноль или более раз
    X+X, один или более раз

    Примечание

    жадные кванторы будут искать как можно больше совпадений. Например, a+ для последовательности aaabbb выдаст «ааа».

    Таблица 16.9. Регулярные выражения — Ленивые кванторы

    Выражение… соответствует
    X??X, один раз или ни разу
    X*?X, ноль или более раз
    X+?X, один или более раз

    Примечание

    ленивые кванторы будут искать как можно меньше совпадений. Например, a+? для последовательности aaabbb выдаст только a.

    Таблица 16.10. Регулярные выражения — Логические операторы

    Выражение… соответствует
    XYX, за которым идёт Y
    X|YЛибо X, либо Y
    (XY)XY как отдельная группа

    1. Инструменты для работы с регулярными выражениями и примеры использования

    Существует несколько программ для разработки и тестирования регулярных выражений. В общем и целом они работают по одному и
    тому же принципу (пример работы программы Regular Expression Tester смотри ниже): регулярное выражение (в верхнем поле) применяется
    к некоему тексту (в поле посередине), результаты работы показываются в нижнем поле.

    Рисунок 16.1. Regex Tester

    Программа The Regex Coach для Windows, GNU/Linux и FreeBSD. Работает по описанному выше принципу.

    Большое количество полезных примеров регулярных выражений можно найти и в самой ОмегаТ (смотри «Параметры» > «Сегментация»). В списке ниже приведены регулярные выражения, которые могут оказаться полезными при
    поиске по памяти перевода:

    Таблица 16.11. Регулярные выражения — Примеры использования регулярных выражений при поиске по переводам

    Регулярное выражениеРезультат поиска:
    (\b\w+\b)\s\1\bслова, написанные дважды
    [\.aeiou]для английского языка: проверка подобная предыдущей, но на слова, начинающиеся с согласных («a», а не «an»)
    \s{2,}больше, чем один пробел подряд
    \.[A-Z]Точка, за которой следует прописная буква, возможно, перед началом нового предложения пропущен пробел?
    \bis\bпоиск «is», но не «this» или «isn’t» и т. д.

    Символы повторения — Документация Python для сетевых инженеров 3.0

    • regex+ — одно или более повторений предшествующего элемента
    • regex* — ноль или более повторений предшествующего элемента
    • regex? — ноль или одно повторение предшествующего элемента
    • regex{n} — ровно n повторений предшествующего элемента
    • regex{n,m} — от n до m повторений предшествующего элемента
    • regex{n,} — n или более повторений предшествующего элемента

    +

    Плюс указывает, что предыдущее выражение может повторяться сколько
    угодно раз, но, как минимум, один раз.

    Например, тут повторение относится к букве a:

    In [1]: line = '100     aab1.a1a1.a5d3    FastEthernet0/1'
    
    In [2]: re.search(r'a+', line).group()
    Out[2]: 'aa'
    

    А в этом выражении повторяется строка „a1“:

    In [3]: line = '100     aab1.a1a1.a5d3    FastEthernet0/1'
    
    In [4]: re.search(r'(a1)+', line).group()
    Out[4]: 'a1a1'
    
    В выражении ``(a1)+`` скобки используются для того, чтобы указать,
    что повторение относится к последовательности символов 'a1'.
    

    IP-адрес можно описать выражением \d+\.\d+\.\d+\.\d+. Тут плюс
    используется, чтобы указать, что цифр может быть несколько. А также
    встречается выражение \..

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

    Используя это выражение, можно получить IP-адрес из строки
    sh_ip_int_br:

    In [5]: sh_ip_int_br = 'Ethernet0/1    192.168.200.1   YES NVRAM  up          up'
    
    In [6]: re.search(r'\d+\.\d+\.\d+\.\d+', sh_ip_int_br).group()
    Out[6]: '192.168.200.1'
    

    Еще один пример выражения: \d+\s+\S+ — оно описывает строку, в
    которой идут сначала цифры, после них пробельные символы,
    а затем непробельные символы (все, кроме пробела, таба и других подобных символов).
    С его помощью можно получить VLAN и MAC-адрес из строки:

    In [7]: line = '1500     aab1.a1a1.a5d3    FastEthernet0/1'
    
    In [8]: re.search(r'\d+\s+\S+', line).group()
    Out[8]: '1500     aab1.a1a1.a5d3'
    

    *

    Звездочка указывает, что предыдущее выражение может повторяться 0 или
    более раз.

    Например, если звездочка стоит после символа, она означает повторение
    этого символа.

    Выражение ba* означает b, а затем ноль или более повторений a:

    In [9]: line = '100     a011.baaa.a5d3    FastEthernet0/1'
    
    In [10]: re.search(r'ba*', line).group()
    Out[10]: 'baaa'
    

    Если в строке line до подстроки baaa встретится b, то совпадением будет
    b:

    In [11]: line = '100     ab11.baaa.a5d3    FastEthernet0/1'
    
    In [12]: re.search(r'ba*', line).group()
    Out[12]: 'b'
    

    Допустим, необходимо написать регулярное выражение, которое описывает
    электронные адреса в двух форматах: [email protected] и [email protected]. То
    есть, в левой части адреса может быть или одно слово, или два слова,
    разделенные точкой.

    Первый вариант на примере адреса без точки:

    In [13]: email1 = '[email protected]'
    

    Этот адрес можно описать таким выражением \w+@\w+\.\w+:

    In [14]: re.search(r'\w+@\w+\.\w+', email1).group()
    Out[14]: '[email protected]'
    

    Но такое выражение не подходит для электронного адреса с точкой:

    In [15]: email2 = '[email protected]'
    
    In [16]: re.search(r'\w+@\w+\.\w+', email2).group()
    Out[16]: '[email protected]'
    

    Регулярное выражение для адреса с точкой:

    In [17]: re.search(r'\w+\.\w+@\w+\.\w+', email2).group()
    Out[17]: '[email protected]'
    

    Чтобы описать оба варианта адресов, надо указать, что точка в адресе
    опциональна:

    Такое регулярное выражение описывает оба варианта:

    In [18]: email1 = '[email protected]'
    
    In [19]: email2 = '[email protected]'
    
    In [20]: re.search(r'\w+\.*\w+@\w+\.\w+', email1).group()
    Out[20]: '[email protected]'
    
    In [21]: re.search(r'\w+\.*\w+@\w+\.\w+', email2).group()
    Out[21]: '[email protected]'
    

    ?

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

    В этой ситуации логичней использовать знак вопроса. Он обозначает ноль
    или одно повторение предыдущего выражения или символа. Теперь регулярное
    выражение выглядит так \w+\.?\w+@\w+\.\w+:

    In [22]: mail_log = ['Jun 18 14:10:35 client-ip=154.10.180.10 [email protected], size=551',
        ...:             'Jun 18 14:11:05 client-ip=150.10.180.10 [email protected], size=768']
    
    In [23]: for message in mail_log:
         ...:     match = re.search(r'\w+\.?\w+@\w+\.\w+', message)
         ...:     if match:
         ...:         print("Found email: ", match.group())
         ...:
    Found email:  [email protected]
    Found email:  [email protected]
    

    {n}

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

    Например, выражение \w{4}\.\w{4}\.\w{4} описывает 12 букв или цифр,
    которые разделены на три группы по четыре символа точками. Таким образом
    можно получить MAC-адрес:

    In [24]: line = '100     aab1.a1a1.a5d3    FastEthernet0/1'
    
    In [25]: re.search(r'\w{4}\.\w{4}\.\w{4}', line).group()
    Out[25]: 'aab1.a1a1.a5d3'
    

    В фигурных скобках можно указывать и диапазон повторений. Например,
    попробуем получить все номера VLAN из строки mac_table:

    In [26]: mac_table = '''
        ...: sw1#sh mac address-table
        ...:           Mac Address Table
        ...: -------------------------------------------
        ...:
        ...: Vlan    Mac Address       Type        Ports
        ...: ----    -----------       --------    -----
        ...:  100    a1b2.ac10.7000    DYNAMIC     Gi0/1
        ...:  200    a0d4.cb20.7000    DYNAMIC     Gi0/2
        ...:  300    acb4.cd30.7000    DYNAMIC     Gi0/3
        ...: 1100    a2bb.ec40.7000    DYNAMIC     Gi0/4
        ...:  500    aa4b.c550.7000    DYNAMIC     Gi0/5
        ...: 1200    a1bb.1c60.7000    DYNAMIC     Gi0/6
        ...: 1300    aa0b.cc70.7000    DYNAMIC     Gi0/7
        ...: '''
    

    Так как search ищет только первое совпадение, в выражение \d{1,4}
    попадет номер VLAN:

    In [27]: for line in mac_table.split('\n'):
        ...:     match = re.search(r'\d{1,4}', line)
        ...:     if match:
        ...:         print('VLAN: ', match.group())
        ...:
    VLAN:  1
    VLAN:  100
    VLAN:  200
    VLAN:  300
    VLAN:  1100
    VLAN:  500
    VLAN:  1200
    VLAN:  1300
    

    Выражение \d{1,4} описывает от одной до четырех цифр.

    Обратите внимание, что в выводе команды с оборудования нет VLAN с номером 1.
    При этом регулярное выражение получило откуда-то число 1.
    Цифра 1 попала в вывод из имени хоста в строке sw1#sh mac address-table.

    Чтобы исправить это, достаточно дополнить выражение и указать, что после
    цифр должен идти хотя бы один пробел:

    In [28]: for line in mac_table.split('\n'):
        ...:     match = re.search(r'\d{1,4} +', line)
        ...:     if match:
        ...:         print('VLAN: ', match.group())
        ...:
    VLAN:  100
    VLAN:  200
    VLAN:  300
    VLAN:  1100
    VLAN:  500
    VLAN:  1200
    VLAN:  1300
    

    Шпаргалка по

    Regex

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

    Таблицы не являются исчерпывающими по двум причинам. Во-первых, все разновидности регулярных выражений индивидуальны, и я не хотел загромождать страницу чрезмерно экзотическим синтаксисом.Чтобы получить полную ссылку на конкретные разновидности регулярных выражений, которые вы будете использовать, всегда лучше сразу обратиться к источнику. Фактически, некоторые механизмы регулярных выражений (такие как Perl, PCRE, Java и .NET) вы можете проверять один раз в год, поскольку их создатели часто вводят новые функции.

    Другая причина, по которой таблицы не являются исчерпывающими, заключается в том, что я хотел, чтобы они служили кратким введением в регулярное выражение. Если вы полный новичок, вы должны получить твердое представление об основном синтаксисе регулярных выражений, просто прочитав примеры в таблицах.Я старался вводить функции в логическом порядке и не допускать странностей, которые я никогда не видел на практике, таких как «символ колокольчика». С этими таблицами в качестве трамплина вы сможете продвигаться к мастерству, исследуя другие страницы сайта.

    Как пользоваться таблицами

    Таблицы предназначены для использования в качестве ускоренного курса регулярных выражений и предназначены для медленного чтения, по одной строке за раз. В каждой строке в крайнем левом столбце вы найдете новый элемент синтаксиса регулярного выражения.В следующем столбце «Легенда» объясняется, что этот элемент означает (или кодирует) в синтаксисе регулярного выражения. Следующие два столбца работают рука об руку: столбец «Пример» дает допустимое регулярное выражение, в котором используется элемент, а столбец «Образец совпадения» представляет текстовую строку, которая может быть сопоставлена ​​регулярным выражением.

    Вы, конечно, можете читать таблицы в Интернете, но если вы страдаете даже самым легким случаем онлайн-СДВ (синдром дефицита внимания), как и большинство из нас… Что ж, я настоятельно рекомендую вам распечатать их.Вы сможете изучать их медленно и использовать в качестве шпаргалки позже, когда будете читать остальную часть сайта или экспериментировать со своими собственными регулярными выражениями.

    Наслаждайтесь!

    Если вы передозируете, не пропустите следующую страницу, которая возвращается на Землю и рассказывает о некоторых действительно интересных вещах: 1001 способ использования Regex .

    Ускоренный курс по регулярным выражениям и шпаргалка

    Для удобства навигации вот несколько точек перехода к различным разделам страницы:

    ✽ Персонажи
    ✽ Кванторы
    ✽ Больше персонажей
    ✽ Логика
    ✽ Подробнее White-Space
    ✽ Больше квантификаторов
    ✽ Классы персонажей
    ✽ Якоря и границы
    ✽ Классы POSIX
    ✽ Встроенные модификаторы
    ✽ Обзоры
    ✽ Операции класса персонажей
    ✽ Другой синтаксис

    (прямая ссылка)

    Персонажи

    Символ Легенда Пример Пример совпадения
    \ d Большинство двигателей: одна цифра
    от 0 до 9
    file_ \ d \ d file_25
    \ d .NET, Python 3: одна цифра Unicode в любом скрипте file_ \ d \ d file_9੩
    \ w Большинство движков: «символ слова»: буква ASCII, цифра или символ подчеркивания \ w- \ w \ w \ w A-b_1
    \ w .Python 3: «символ слова»: буква Юникода, идеограмма, цифра или знак подчеркивания \ w- \ w \ w \ w 字 -ま _۳
    \ w .NET: «символ слова»: буква Юникода, идеограмма, цифра или соединитель \ w- \ w \ w \ w 字 — ま ‿۳
    \ s Большинство движков: «пробельный символ»: пробел, табуляция, новая строка, возврат каретки, вертикальная табуляция a \ sb \ sc ab
    c
    \ s.NET, Python 3, JavaScript: «пробельный символ»: любой разделитель Unicode a \ sb \ sc ab
    c
    \ D Один символ, который не является цифрой , как определено в вашего движка \ d \ D \ D \ D ABC
    \ W Один символ, который не является символом слова , как определено в \ w \ W \ W \ W \ W \ W * — + =)
    \ S Один символ, который не является пробельным символом , как определено в вашем движке \ s \ S \ S \ S \ S Yoyo

    (прямая ссылка)

    Квантификаторы

    Квантификатор Легенда Пример Образец совпадения
    + Один или несколько Версия \ w- \ w + Версия A-b1_1
    {3} Ровно три раза \ D {3} ABC
    {2,4} Два-четыре раза \ d {2,4} 156
    {3,} Три или более раз \ w {3,} regex_tutorial
    * Ноль или более раз A * B * C * AAACC
    ? Один раз или нет во множественном числе? множественное число

    (прямая ссылка)

    Еще персонажи

    Символ Легенда Пример Пример совпадения
    ./ \
    \ Экранирует специальный символ \ [\ {\ (\) \} \] [{()}]

    (прямая ссылка)

    Логика

    Логика Легенда Пример Пример совпадения
    | Чередование / операнд ИЛИ 22 | 33 33
    (…) Группа захвата A (nt | pple) Apple (захватывает «pple»)
    \ 1 Содержимое группы 1 r (\ w) g \ 1x регулярное выражение
    \ 2 Содержимое группы 2 (\ d \ d) \ + (\ d \ d) = \ 2 \ + \ 1 12 + 65 = 65 + 12
    (?:…) Группа без захвата A (?: Nt | pple) Apple

    (прямая ссылка)

    Подробнее White-Space

    Символ Легенда Пример Пример соответствия
    \ t Tab T \ t \ w {2} T ab
    \ r Символ возврата каретки см. ниже
    \ n Символ перевода строки см. ниже
    \ r \ n Разделитель строк в Windows AB \ r \ nCD AB
    CD
    \ N Perl, PCRE (C, PHP, R…): один символ, не являющийся разрывом строки \ N + ABC
    \ h Perl, PCRE (C, PHP, R…), Java: один горизонтальный пробельный символ: табуляция или разделитель пробелов Unicode
    \ H Один символ, не являющийся горизонтальным пробелом
    \ v.NET, JavaScript, Python, Ruby: вертикальная табуляция
    \ v Perl, PCRE (C, PHP, R…), Java: один вертикальный пробел: перевод строки, возврат каретки, вертикальная табуляция, подача формы , разделитель абзацев или строк
    \ V Perl, PCRE (C, PHP, R…), Java: любой символ, кроме вертикального пробела
    \ R Perl, PCRE (C, PHP, R…), Java: один разрыв строки (пара возврата каретки + перевода строки и все символы, соответствующие \ v)

    (прямая ссылка)

    Другие квантификаторы

    Квантификатор Легенда Пример Пример совпадения
    + Знак + (один или несколько) «жадный» \ d + 12345
    ? Делает кванторы «ленивыми» \ d +? 1 дюйм 1 2345
    * Знак * (ноль или более) означает «жадный» A * AAA
    ? Делает кванторы «ленивыми» A *? пустой в AAA
    {2,4} Два-четыре раза, «жадный» \ w {2,4} abcd
    ? Делает кванторы «ленивыми» \ w {2,4}? ab в ab cd

    (прямая ссылка)

    Классы символов

    Символ Легенда Пример Пример совпадения
    […] Один из символов в скобках [AEIOU] Один гласный в верхнем регистре
    […] Один символов в скобках T [ao] p Tap или Top
    Индикатор диапазона [az] Одна строчная буква
    [xy] Один из символов в диапазоне от x до y [AZ] + GREAT
    […] Один из символов в скобках [AB1-5w-z] Один из любого : A, B, 1,2,3,4,5, w, x, y, z
    [xy] Один из символов в диапазоне от x до y [- ~] + Символы в печатаемой части таблицы ASCII. Начало строки или начало строки в зависимости от многострочного режима.abc. * abc (начало строки)
    $ Конец строки или конец строки в зависимости от многострочного режима. Много зависящих от двигателя тонкостей.. *? конец $ это конец
    \ A Начало строки
    (все основные движки, кроме JS)
    \ Aabc [\ d \ D] * abc (строка …
    .. .start)
    \ z Самый конец строки
    Недоступно в Python и JS
    конец \ z это… \ n … конец
    \ Z Конец строки или (кроме Python) перед окончательным разрывом строки
    Недоступно в JS
    конец \ Z это … \ n … конец \ n
    \ G Начало строки или конец предыдущего совпадения
    .NET, Java, PCRE (C, PHP, R…), Perl, Ruby
    \ b Граница слова
    Большинство движков: позиция, где только одна сторона представляет собой букву ASCII, цифру или знак подчеркивания
    Боб .* \ bcat \ b Боб съел кота
    \ b Граница слова
    .NET, Java, Python 3, Ruby: позиция, в которой только одна сторона представляет собой букву, цифру или знак подчеркивания Юникода
    Боб. * \ b \ кошка \ b Боб съел кошку
    \ B Не граница слова c. * \ Bcat \ B. * copycats

    (прямая ссылка)

    Классы POSIX

    Символ Легенда Пример Пример совпадения
    [: alpha:] PCRE (C, PHP, R…): буквы ASCII AZ и az [8 [: alpha:]] + WellDone88
    [: alpha:] Ruby 2: буква Unicode или идеограмма [[: alpha:] \ d] + кошка99
    [: alnum:] PCRE ( C, PHP, R…): цифры и буквы ASCII AZ и az [[: alnum:]] {10} ABCDE12345
    [: alnum:] Ruby 2: цифра, буква или идеограмма Unicode [[: alnum:]] {10} кошка
    [: punct:] PCRE (C, PHP, R…): знак препинания ASCII [[: punct:]] +?!.,:;
    [: punct:] Ruby: знак препинания Unicode [[: punct:]] +‽,: 〽⁆

    (прямая ссылка)

    Ни один из них не поддерживается в JavaScript. В Ruby остерегайтесь (? S) и (? M).

    Модификатор Легенда Пример Выборочное соответствие
    (? I) Режим без учета регистра
    (кроме JavaScript)
    (? i) понедельник понедельник
    (? s) DOTALL режим (кроме JS и Ruby).3 $ 1
    2
    3
    (? M) В Ruby: то же, что и (? S) в других движках, т.е. режим DOTALL, т.е. точка соответствует разрывам строки (? M) От A . * до Z От A
    до Z
    (? x) Режим свободного интервала
    (кроме JavaScript). Также известен как режим комментариев или режим пробелов
    (? X) # это
    # комментарий
    abc # запись на нескольких
    # строках
    [] d # пробелы должны быть
    # в скобках
    abc d
    (? п).) PCRE 10.32+: сбросить модификаторы Сбросить модификаторы ismnx

    (прямая ссылка)

    (прямая ссылка)

    Class Operation Legend Example Sample Match
    [… — […]] .NET: вычитание класса символов. Один символ, который находится в тех, которые находятся слева, но не в вычитаемом классе. [a-z- [aeiou]] Любой согласный в нижнем регистре
    [… — […]].NET: вычитание класса символов. [\ p {IsArabic} — [\ D]] Арабский символ, не являющийся нецифровой цифрой, например арабская цифра
    [… && […]] Java, Ruby 2+ : пересечение классов символов. Один символ, который есть как слева, так и в классе &&. [\ S && [\ D]] Непробельный символ, не являющийся цифрой.
    [… && […]] Java, Ruby 2+: пересечение символьных классов.\ p {L} \ p {N}]] Арабский символ, не являющийся буквой или числом

    (прямая ссылка)

    Другой синтаксис

    Синтаксис Легенда Пример Пример совпадения
    \ K Не пропускать
    Perl, PCRE (C, PHP, R…), альтернативный механизм Python regex , Ruby 2+: отбросьте все, что было найдено до сих пор из общего совпадения, чтобы вернуть префикс
    \ K \ d + 12
    \ Q… \ E Perl, PCRE (C, PHP, R…), Java: рассматривать все, что находится между разделителями, как буквальную строку.Полезно для экранирования метасимволов. \ Q (C ++?) \ E (C ++?)

    1001 способ использования Regex

    Учебное пособие по

    Regex — регулярные выражения имеют много применений

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

    Regex — это подарок, который продолжает дарить. Изучив его, вы обнаружите, что он пригодится во многих местах, где вы не планировали его использовать. На этой странице мы сначала рассмотрим ряд контекстов и программ, в которых вы можете найти регулярное выражение. Затем мы кратко рассмотрим некоторые разновидности регулярных выражений, с которыми вы можете столкнуться. Наконец, мы изучим несколько примеров шаблонов регулярных выражений в таких контекстах, как:

    ✽ Переименование файла
    ✽ Текстовый поиск
    ✽ Веб-директивы (Apache)
    ✽ Запросы к базе данных (MySQL)

    Заявление об ограничении ответственности: я давно не редактировал эту страницу.В результате контент не такой безупречный, как на большинстве других моих страниц. Я надеюсь, что скоро доберусь до него.

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

    Вот некоторые вещи, в которых вам могут помочь регулярные выражения.

    1. Захват текста в файлах или проверка ввода текста при программировании на таких языках, как C, Java или PHP.

    2. Поиск (и, возможно, замена) текста в файлах при использовании расширенного текстового редактора, такого как EditPad Pro и Notepad ++ в Windows (или TextWrangler / BBEdit в OSX), автономного инструмента замены, такого как ABA Replace, или старого доброго grep ( связанная страница имеет лучший grep командной строки для Windows).

    Несколько слов об упомянутых инструментах. Среди текстовых редакторов EditPad Pro находится в особой лиге, потому что его движок регулярных выражений был запрограммирован создателем RegexBuddy. Если вы хотите попробовать EditPad Pro, загрузите бесплатную пробную версию . В бесплатном Notepad ++ раньше отсутствовал отдел регулярных выражений, но, начиная с версии 6, в нем использовался отличный движок PCRE, хотя интерфейс все еще неуклюжий. В OSX бесплатный TextWrangler, его старший брат BBEdit, оба заявляют, что используют PCRE.Что они не говорят, так это то, что они используют версию PCRE 4.0 от 17 февраля 2003 года — или мне так кажется, поскольку она поддерживает [: blank:] из 4.0, но не \ X из 5.0. Это означает, что не хватает многих пикантных функций. Тем не менее, PCRE десятилетней давности намного лучше, чем JavaScript.

    Для замены в текстовых файлах я люблю ABA Replace. Он выполняет одну работу, и делает это блестяще: ищет и заменяет текст в файле или сразу во многих файлах. В окне результатов результаты меняются мгновенно, когда вы настраиваете выражение, так же, как в RegexBuddy.

    Я использую регулярное выражение для переименования файлов, для поиска в файлах, для крупномасштабных замен в коде, в коде (PHP), в базах данных (mySQL) и для управления моим веб-сервером (Apache).

    3. Поиск и замена на страницах кода при использовании в среде IDE, такой как Visual Studio, Komodo IDE или даже урезанный вариант ECMAScript от Dreamweaver.

    4. Для расширенного поиска и замены при использовании программного обеспечения для творчества, такого как Adobe Indesign.

    5. Переименование ста файлов за раз в расширенном файловом менеджере, таком как Directory Opus, или в переименователе, таком как PFrank (Win) или A Better Finder Rename (OSX).

    Я должен поспешить добавить, что действительно нет ничего «подобного» Directory Opus. Opus — уникальный инструмент, на мой взгляд, самый важный инструмент повышения производительности, который может иметь пользователь Windows! Почему такое экстравагантное заявление? Потому что для большинства пользователей огромное количество компьютерного времени незаметно исчезает в черной дыре файловых операций — поиска, перемещения и переименования файлов. Если вы еще не видели его, вы действительно обязаны совершить поездку по функциям Directory Opus или установить бесплатную полнофункциональную 60-дневную пробную версию.

    6. Поиск из командной строки с использованием однострочников Perl и таких утилит, как grep, sed и awk .

    7. Поиск записей в базе данных.

    8. Сообщая Apache, как вести себя с определенными IP-адресами, URL-адресами или браузерами, например, в htaccess.

    9. Помогаем вам скоротать утомительные послеобеденные рабочие часы, обмениваясь задачами с регулярными выражениями с коллегами.

    Если я пропустил важную категорию, напишите мне комментарий внизу страницы.

    Regex ароматизаторы

    Как я уверен, вы знаете, регулярные выражения известны под разными именами: regex или все более редкое regexp и их множественные регулярные выражения , regexps или regexen .

    Что еще более важно, регулярное выражение также имеет множество разновидностей. В окне RegexBuddy, замечательного маленького инструмента для регулярных выражений, без которого я не могу работать (подробнее об этом позже, бесплатная пробная версия скачать здесь), я могу выбирать между контекстами, такими как C #, Python, Java, PHP, Perl, Ruby, JavaScript. , Scala и многие другие.Видите ли, каждый, кто реализует движок регулярных выражений, делает это немного иначе, чем кто-либо другой.

    Двигатели, стоящие за этими ароматизаторами, делятся на две основные группы:
    ✽ направленный на регулярное выражение (или NFA, что означает Недетерминированный конечный автомат )
    ✽ текстовый (или DFA, что означает Deterministic Finite Automaton )

    Когда вы можете выбирать между NFA или DFA, NFA обычно является самым быстрым. Это действительно самая распространенная реализация в современных языках.

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

    flavor Вариант .NET при программировании на C #.
    ✽ Вариант PCRE при программировании на PHP и для Apache.
    ✽ Модуль regex Мэтью Барнетта для Python.
    ✽ Версия расширенного регулярного выражения POSIX (ERE) в mySQL.
    ✽ Версия JGSoft для поиска и замены в EditPad Pro.
    ✽ Варианты Java, JavaScript, Perl, Ruby и Objective-C при ответах на вопросы на форумах.
    ✽ Версия TR1 для переименования файлов в Directory Opus.
    ✽ Вариант ABA (основанный на библиотеке Генри Спенсера) в ABA Search Replace.

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

    Поиск и замена из командной строки

    Не зная языка Perl, если вы знаете регулярное выражение, вы можете создавать мощные однострочные команды Perl для выполнения в оболочке вашей операционной системы.Например, вы можете обернуть простое регулярное выражение \ bc \ w + внутри некоторого однострочного кода шаблона Perl, чтобы сопоставить или заменить все слова файла, начинающиеся с буквы c . Для получения дополнительных сведений см. Мою страницу о том, как создавать однострочные регулярные выражения Perl.

    Среди утилит командной строки, которые понимают регулярные выражения, вы можете встретить grep, sed, awk и другие. Среди них grep — самый известный. Моя страница о grep содержит примеры, а также загрузку того, что, на мой взгляд, является лучшей версией grep для Windows (в ней используется движок PCRE).

    Примеры регулярных выражений для переименования файлов

    В этом разделе мы будем использовать синтаксис регулярных выражений Directory Opus. (На Mac я бы использовал специальный переименователь файлов под названием A Better Finder Rename, который, помимо функций регулярных выражений, представляет собой небольшую жемчужину, поскольку позволяет не-гикам создавать сложные операции переименования в серии простых шагов или «слоев». )

    Функция переименования в Opus позволяет сохранять ваши любимые шаблоны регулярных выражений. Поскольку вы редко выполняете одну и ту же операцию переименования, я стараюсь сохранять регулярные выражения, которые я могу снова открыть и быстро настроить в соответствии со своими потребностями..] + $
    Заменить: \ 1rar

    Перевод: в начале имени файла жадно сопоставьте любые символы, затем точку, захватывая это в Группу 1. Жадная точка-звезда будет стрелять в конец имени файла, а затем вернуться к последняя точка. Этот захват является основой имени файла. После этого захвата сопоставьте любой символ, не являющийся точкой: расширение. Замените все это содержимым группы 1, выраженным как \ 1 или $ 1 (это захваченная основа, включающая точку) и «rar».-] *) — (. *) #
    Заменить: \ 1 \ 2

    Перевод: Сопоставьте и захватите любые символы без тире в Группу 1, сопоставьте тире, затем съедите любые символы, захватив те, что находятся в Группе 2. Замените имя файла первой группой, за которой сразу же второй группой (тире нет). Символ решетки в первой строке (#) указывает механизму DOpus выполнять эту замену до тех пор, пока строка не перестанет изменяться. Таким образом, все тире удаляются один за другим.

    Замена точек пробелами в именах файлов

    Этот шаблон подходит для случаев, когда у вас есть 95 файлов, которые выглядят примерно так:

    Имена файлов, подлежащих очистке:
    ..] +) $ # Жадно съедайте все, что не является точкой, до конца имени файла, захватывая это в группе 3 (это расширение)

    Последний символ решетки (#) указывает Opus повторять операцию замены до тех пор, пока не останутся точки, которые можно есть, и имя файла не будет очищено. Строка замены берет захваченные группы и вставляет пробел вместо каждой точки.

    Обмен двух частей имени файла

    Предположим, вы назвали множество файлов фильмов в соответствии с этим шаблоном:

    8.2 День сурка (1993) .avi

    Число впереди — это рейтинг фильма на IMDB. Число в скобках в конце — год выхода фильма. Однажды вы решите, что вместо сортировки фильмов по рейтингу вы действительно хотите отсортировать их по годам, что означает, что в имени файла вы хотите поменять местами рейтинг и год. Вы хотите, чтобы ваши файлы выглядели так:

    (1993) День сурка 8.2.avi

    Без регулярных выражений у вас проблемы.(] *) # Во второй группе жадно фиксируйте все, что не является открывающей скобкой.

    (\ ([\ d] {4} \)) # В третьей группе захватите открывающую скобку (которую нужно экранировать в регулярном выражении), четыре цифры и закрывающую скобку.

    (. *) # В последней группе захватить что угодно.

    Шаблон замены просто берет четыре группы и изменяет их порядок.

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

    Что хорошего в текстовых редакторах, если вы не можете выполнять сложный поиск? Я проверил эти примеры выражений в EditPad Pro, но они, вероятно, будут работать в Notepad ++ или в IDE, поддерживающей регулярные выражения.

    Семибуквенное слово, содержащее слово «сено»

    Некоторые примеры могут показаться надуманными, но иметь под рукой небольшую библиотеку готовых регулярных выражений — это просто потрясающе.

    Схема поиска: (? = \ B \ w {7} \ b) \ w *? Hay \ w *
    Перевод: Посмотрите прямо вперед, найдите слово из семи букв (границы \ b важны). Лениво съедайте любые символы слов, за которыми следует «сено», а затем съедайте любые символы слова. Мы знаем, что жадное сопоставление должно прекратиться, потому что слово состоит из семи символов.

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

    Традиционное слово (только буквы): (? I) (? = \ B [AZ] {7} \ b) \ w *? Hay \ w *

    В этом шаблоне при поиске вы можете видеть, что я заменил \ w {7} на [AZ] {7}, что соответствует семи заглавным буквам. Чтобы включить строчные буквы, мы могли бы использовать [A-Za-z] {7}.(? =. *? \ bbubble \ b). *? \ bgum \ b. *
    Перевод: пока вы привязываете начало строки, ищите любые символы, за которыми следует слово пузырь . Мы могли бы использовать второй просмотр вперед для поиска резинки , но быстрее просто сопоставить всю строку, позаботившись о совпадении резинки на подходе.

    Строка Содержит «мальчик» или «купи»
    Схема поиска: \ bb [ou] y \ b
    Перевод: внутри слова (внутри двух границ \ b) сопоставьте символ b , затем один символ, который равен либо o , либо u , затем y .

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

    Вы можете найти миллион способов написать повторяющийся шаблон слов. В этом я использовал классы POSIX (доступные в Perl и PHP), что позволило нам добавлять дополнительные знаки препинания между словами в дополнение к необязательному пробелу.

    Шаблон поиска: \ b ([[: alpha:]] +) [[: punct:]] + \ 1
    Перевод: после разделителя слов в первой группе захватите положительное количество букв, затем съедите пробелы или знаки препинания, а затем сопоставьте то же слово, которое мы захватили ранее в первой группе.

    Если вы не хотите использовать знаки препинания, просто используйте \ s + вместо [[: punct:]] +.

    Помните, что \ s съедает любых символов пробела, включая символы новой строки, табуляции и вертикальные табуляции, поэтому, если это не то, что вы хотите, используйте [] + для указания пробелов.(?!. * резинка) (?!. * ванна). *? пузырь. *
    Перевод: в начале строки заявите, что следующее не является «никакими символами, затем gum », подтвердите, что следующее не будет «никакими символами, затем ванна », затем сопоставьте всю строку, убедившись, что вы выбрали пузырь в пути.

    Адрес электронной почты
    Если мне когда-нибудь придется искать адрес электронной почты в текстовом редакторе, честно говоря, я просто ищу @. Это показывает мне как правильно сформированные адреса, так и адреса, авторы которых дают волю своему творчеству, например, набрав DOT вместо точки.

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

    Регулярное выражение ниже заимствовано из главы 4 прекрасной книги Яна Гойверта, Поваренная книга регулярных выражений . Я согласен с рассуждениями Яна о том, что вам действительно нужно выражение, которое работает с 999 адресами из тысячи, выражение, которое не требует большого обслуживания, например, заставляя вас добавлять новые домены верхнего уровня. («расставьте что-нибудь») каждый раз, когда власти, отвечающие за эти вещи, решают, что пора запускать имена, заканчивающиеся чем-то вроде dot-phone или dot-dog.

    Шаблон поиска: (? I) \ b [A-Z0-9 ._% + -] + @ (?: [A-Z0-9 -] + \.) + [AZ] {2,6} \ b

    Давайте развернем эту:

    (? i) # Включить режим без учета регистра

    \ b # Позиционировать движок на границе слова

    [A-Z0-9 ._% + -] + # Сопоставить один или несколько символов в скобках: буквы, цифры , точка, подчеркивание, процент, плюс, минус. Да, некоторые из них редко встречаются в адресах электронной почты.

    @ # Соответствует @

    (?: [A-Z0-9 -] + \.) + # Соответствует одной или нескольким строкам, за которыми следует точка, такие строки состоят из букв, цифр и дефисов. Это домены и поддомены, например, post. и microsoft. на post.microsoft.com

    [A – Z] {2,6} # Соответствие от двух до шести букв, например US, COM, INFO. Это должен быть домен верхнего уровня. Да, это тоже соответствует СОБАКЕ. Вы должны решить, хотите ли вы достичь точности бритвы за счет необходимости поддерживать ваше регулярное выражение при введении новых TLD.

    \ b # Соответствует границе слова

    Примеры регулярных выражений для директив веб-сервера (Apache)

    Если вы используете Apache, скорее всего, у вас есть регулярные выражения где-то в вашем файле .htaccess или в файле конфигурации httpd.conf. Как и PHP, Apache использует регулярные выражения типа PCRE.

    Вот несколько примеров.

    Перенаправление в новый каталог
    Иногда вы решаете изменить структуру каталогов.Посетители, которые переходят по старой ссылке, будут запрашивать старые URL-адреса. Вот как может помочь регулярное выражение в htaccess.

    RewriteRule old_dir /(.*)$ new_dir / $ 1 [L, R = 301]

    Объяснение: Старый URL-адрес записан в Группу 1 и добавлен в конец нового пути.

    Ориентация на определенные браузеры

    BrowserMatch \ bMSIE no-gzip

    Эта директива проверяет, содержит ли имя браузера пользователя «MSIE» (с границей слова перед «M»).Если это так, Apache применяет то, что следует в строке. (В этом случае no-gzip говорит Apache не сжимать контент.)

    Таргетинг на определенные файлы


    Заголовочный набор Cache-Control «max-age = 43200»

    В первой строке этой директивы htaccess для кэширования файлов есть небольшие файлы, соответствующие регулярному выражению, оканчивающиеся точкой и «htm» или «html».

    Другие регулярные выражения в Apache
    RewriteCond% {HTTP_USER_AGENT} ^ Zeus.13 $
    Цель: в правиле перезаписи проверить, равен ли час часу дня.

    Есть и другие варианты использования регулярных выражений в Apache. Эти примеры должны дать вам представление. Для получения дополнительной информации вы можете просмотреть страницу руководства для mod_rewrite, страницу mod_rewrite, руководство по перезаписи и расширенное руководство по перезаписи.

    Использует ли Apache ту же версию PCRE, что и PHP?
    Не обязательно. Чтобы узнать, какая версия PCRE PHP используется, посмотрите на результат phpinfo () и найдите PCRE.Помимо номера версии, вы найдете ссылку на каталог: что-то вроде pcre-regex = / opt / pcre. Другой способ найти эту папку — запустить ldd / some / path / php | grep pcre в оболочке, где some / path — это путь, возвращаемый функцией which php.

    Вы можете использовать этот каталог в командной строке оболочки, чтобы получить дополнительную информацию о вашей версии PCRE:
    / opt / pcre / bin / pcretest -C

    На cPanel EasyApache устанавливает PCRE в папку / opt, поэтому, если PHP сообщает о папке выше, вы можете ожидать, что mod_rewrite и PHP используют одну и ту же версию PCRE (если в cPanel нет ошибки).

    При других установках вам может потребоваться найти все установленные версии pcretest, чтобы увидеть, какие версии установлены:
    find / -name pcretest

    Примеры регулярных выражений для поиска записей в базе данных (MySQL)

    Чтобы проиллюстрировать базовое использование регулярных выражений в MySQL, вот пример, который выбирает записи, поле YourField которых заканчивается на «ty».

    ВЫБРАТЬ * ИЗ YourDatabase ГДЕ YourField REGEXP 'ty $';

    Вот второй пример выбора полей, которые содержат , а не , содержащие цифру:

    SELECT * FROM YourDatabase WHERE YourField NOT REGEXP "[[: digit:]]";

    Вы можете использовать RLIKE вместо REGEXP, поскольку они являются синонимами.Но зачем тебе это?

    Регулярные выражения в MySQL нацелены на соответствие стандарту POSIX 1003.2, также известному как библиотека «regex 7» Гарри Спенсера. На странице документации MySQL для REGEXP указано, что она неполная, но что полная информация включена в исходные коды MySQL, в файл regex.7… Хорошо, это затруднительно, но давайте загрузим исходный код. О, нет, нельзя, нужен специальный установщик только для того, чтобы скачать исходный код. Неважно, вот копия справочной страницы regex (7).

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

    Если вы привыкли к регулярным выражениям, подобным Perl, вариант MySQL POSIX будет звучать как детский лепет. Если вам нужно больше мощности, вы можете рассмотреть библиотеку PCRE для MySQL. Поскольку я обновляю свой сервер MySQL для основных выпусков, риск прямой несовместимости немного высок, и я придерживаюсь регулярного выражения (7).

    Элементы стиля Regex

    Уловки с регулярными выражениями

    На этой странице я хотел бы собрать несколько полезных трюков с регулярными выражениями.Идея здесь не в том, чтобы собрать кулинарную книгу рецептов регулярных выражений, которая соответствовала бы тому или иному — для этого см. Страницу кулинарной книги и множество страниц трюков, ссылки на которые есть слева.

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

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

    Очки для прыжков
    Для удобства навигации вот несколько точек перехода к различным разделам страницы:

    ✽ Принудительный отказ: конструкции регулярных выражений, которые никогда не соответствуют
    ✽ Четность и выше: убедитесь, что длина строки кратна n
    ✽ Слово в верхнем регистре, которое позже появится в нижнем регистре
    ✽ Атомные группы для двигателей, которые не поддерживают его
    ✽ Предварительно определенные подпрограммы для двигателей, которые его не поддерживают
    ✽ Имитация чередования, количественно определяемого звездой
    ✽ Разные хитрости

    (прямая ссылка)

    Принудительный отказ: конструкции регулярных выражений, которые никогда не совпадают с

    Иногда вы хотите остановить механизм регулярных выражений на своем пути, вставив выражение, которое всегда терпит неудачу. а].и $ менее надежны из-за многострочного режима.

    Стандартное решение
    Чтобы заставить механизм регулярных выражений выйти из строя и вернуться назад, наиболее часто используемое выражение, вероятно, следующее:

    (?!)
    Его компактность непревзойденная. Как это работает? (?!…) — это отрицательный взгляд вперед, утверждающий, что то, что стоит в скобках после?! не может быть сопоставлено. В (?!) Между (?! И закрывающими круглыми скобками нет ничего, это отсутствие интерпретируется механизмом как пустая строка.

    Механизм регулярных выражений переводит (?!) Как «утверждение, что в этой позиции пустая строка не может быть сопоставлена». Пустая строка всегда может быть сопоставлена, поэтому движок не соответствует утверждению (?!). Это заставляет его возвращаться в поисках другого совпадения, если таковое может быть найдено.

    Впервые я наткнулся на эту маленькую жемчужину в Поваренной книге регулярных выражений , но я не знаю, кто ее изобрел.

    В Perl, PCRE (C, PHP, R…) и альтернативном движке regex Python есть специальный токен, который никогда не может совпадать, вынуждая движок отказывать и заставляя его возвращаться в поисках другого совпадения.Это может быть написано (* FAIL) или (* F). Внутренне PCRE оптимизирует (?!) До (* F).

    Вы можете прочитать все о (* FAIL) на моей странице о глаголах управления возвратом.

    Зачем вам токен, который никогда не совпадает?
    Среди прочего, пригодятся жетоны, которые всегда терпят неудачу:
    — в условных выражениях, которые проверяют условия балансировки в строке (например, движок обнаружил «открывающую конструкцию», теперь вы хотите, чтобы она соответствовала соответствующей закрывающей конструкции),
    — исследовать ветви дерева спичек.

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

    Когда я использую этот трюк, гарантировано ли совпадение регулярного выражения не удастся?
    Не обязательно. Хотя конструкция (?!) И ее эквиваленты никогда не совпадают, это не означает, что содержащие их шаблоны не будут совпадать: после неудачного совпадения (?!) Движок пытается выполнить возврат и может найти альтернативный путь это удается.

    Если ваш шаблон разработан таким образом, что поиск с возвратом бесполезен, попытка сопоставления не удастся.(?:. {n}) + $

    Если ваша строка занимает несколько строк, вы можете начать с чего-то вроде (? s) \ A (?:. {n}) + \ z, используя однострочное ( DOTALL), чтобы точка соответствовала разрывам строки, а якоря A и z — для привязки всей строки. Каждый символ разрыва строки будет считаться одним символом, поэтому это, вероятно, менее полезно.

    (прямая ссылка)

    Найдите слово в верхнем регистре, которое позже появится в нижнем регистре

    Эта идея была показана в разделе встроенных модификаторов на главной странице синтаксиса.

    (\ b [A-Z] + \ b) (? =. * (? = \ B [a-z] + \ b) (? I) \ 1)
    Слово в верхнем регистре записывается в Группу 1. Затем мы сопоставляем символы до точки, в которой опережающий просмотр (? = [Az] + \ b) может утверждать, что следующее слово является нижним регистром, затем мы устанавливаем регистронезависимость режим включен, и мы совпадаем с содержанием Группы 1.

    В .NET мы могли бы использовать ретроспективный просмотр вместо двойного просмотра вперед:
    (\ b [A-Z] + \ b) (? =. * \ B [a-z] + \ b (? I) (?

    (прямая ссылка)

    Атомные группы для двигателей, которые его не поддерживают

    Среди основных движков JavaScript и Python разделяют сомнительное отличие: они не поддерживают синтаксис атомарной группировки, такой как (?> A +)

    Этот прием позволяет обойти это: (? = (A +)) \ 1.Предварительный просмотр утверждает, что выражение, которое мы хотим сделать атомарным, т.е. A + — можно найти в текущей позиции, и круглые скобки фиксируют ее. Затем обратная ссылка \ 1 совпадает с ней. Пока что это просто длинный способ сопоставления A +. Волшебство случается, если токен не соответствует более низкому шаблону. Движок не будет возвращаться к поиску, и на то есть веская причина: если его утверждение истинно в данной позиции, оно истинно! Следовательно, группа 1 сохраняет то же значение, и движок должен отказаться от того, что было сопоставлено A + в одном блоке.

    На странице «Сокращение (?…) Синтаксической путаницы» рассмотрены два примера атомарных групп. Ссылаясь на эту страницу, чтобы узнать, что они делают, вот эквивалентные «псевдоатомные» группы в JavaScript и Python:

    (?> A +) [A-Z] C
    переводится как
    (? = (A +)) \ 1 [A-Z] C

    и
    (?> A | .B) C
    переводится как
    (? = A | .B) \ 1C

    (прямая ссылка)

    Предварительно определенные подпрограммы для двигателей, которые его не поддерживают

    Perl, PCRE (C, PHP, R…) и альтернативный механизм Python regex поддерживают потрясающий (? (DEFINE)…) синтаксис, который позволяет вам заранее определять именованные подпрограммы регулярных выражений и использовать их для создания красивых модульных шаблонов, таких как регулярное выражение для соответствия числам на простом английском языке.

    В настоящее время единственный известный мне движок, поддерживающий подпрограммы, Ruby 1.9+, не поддерживает синтаксис (? (DEFINE)…). Я придумал этот трюк, чтобы использовать предопределенные подпрограммы в этих двух движках.

    Как и в случае с (? (DEFINE)…), идея состоит в том, чтобы поместить определения в раздел в начале регулярного выражения, хотя вы можете поместить их где угодно перед вызовом подпрограммы. Каждое определение выглядит так:

    (? :(? …) (?!))?

    Здесь имя подпрограммы — foo , а сама подпрограмма занимает место многоточия….Например, (? :(? \ b [A-Z] + \ b) (?!))? определяет подпрограмму для слова, написанного заглавными буквами.

    Как только подпрограмма определена, вы вызываете ее с помощью \ g (Ruby). Это делает очень удобным многократный вызов паттернов (особенно если они длинные), сохранение их в одном месте и т. Д.

    Как работает трюк?
    Прежде чем мы рассмотрим полный пример, давайте обсудим, как это работает. Внешние скобки в (? :(? …) (?!))? определить группу без захвата.Группа делает необязательной? квантификатор. Как мы скоро увидим, группа без захвата всегда дает сбой, а квантификатор ноль или единица ? это то, что позволяет нам продолжать после этого внутреннего провала.

    Внутри группы без захвата мы начинаем со стандартного определения именованной группы (? …). Это создает именованную группу и именованную подпрограмму.

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

    Вот почему после определения именованной группы и подпрограммы мы заставляем не захватывающую группу выйти из строя, используя (?!), Который мы видели ранее на странице с уловкой принудительного отказа. Конечно, мы не хотим, чтобы все регулярное выражение завершилось сбоем, поэтому мы используем квантификатор?, Чтобы сделать группу без захвата необязательной.

    Полный пример

    Этот пример идентичен приведенному в разделе о предопределенных подпрограммах: он определяет базовую грамматику, позволяя нам сопоставлять предложения, такие как пять синих слонов решают множество интересных задач и многие большие задачи напоминают некоторые интересные автомобили

    Это для рубинов :

    (? x) # режим пробелов
      ####### ОПРЕДЕЛЕНИЯ ######### 
    # предварительное определение подпрограммы количественного анализа
    (? :(?  многие | некоторые | пять) (?!))?
    
    # предопределить подпрограмму adj
    (? :(?  синий | большой | интересный) (?!))?
    
    # предопределить объектную подпрограмму
    (? :(? <объект> автомобили | слоны | проблемы) (?!))?
    
    # предварительно определить подпрограмму noun_phrase
    (? :(?  \ g  \ \ g  \ \ g ) (?!))?
    
    # предварительно определить подпрограмму глагола
    (? :(?  заимствовать | решать | похожи) (?!))?
    ####### КОНЕЧНЫЕ ОПРЕДЕЛЕНИЯ #######
    
      ##### Здесь начинается сопоставление регулярных выражений ##### 
    \ g  \ \ g  \ \ g 
    
     

    (прямая ссылка)

    Имитация чередования, количественно выраженная звездочкой

    Вы хотите сопоставить серию или жетоны joe_ или bob_ , как в:
    joe_joe_joe_bob_joe_bob_
    Допускаем пустой матч.

    Ваша первая мысль, вероятно, (?: Bob_ | joe _) *
    Но можно ли выполнить ту же задачу без чередования?

    Это сделает это:
    (?: Bob _) * (? :( ?: joe _) + (?: bob _) *) *

    После того, как (?: Bob _) * соответствует нулю или более токенов bob_ , мы сопоставляем (ноль или более раз) один или несколько токенов joe_ , за которыми следует ноль или более токенов bob_ .

    В более общем плане (A | B) * становится A * (?: B + A *) *.

    Мы используем эту технику в решении проблемы «Жадная ловушка» в решении «Чередование развернутой звезды».

    (прямая ссылка)

    Разные хитрости

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

    ✽ двойные отрицательные разделители
    ✽ Я реализовал демонстрацию бесконечного просмотра назад для PCRE.

    Поваренная книга Regex

    Учебное пособие по регулярным выражениям

    Знание английского алфавита не делает вас Хемингуэем. Точно так же знание синтаксиса регулярного выражения не делает вас грамотным с регулярным выражением. Стилю трудно научить начинающих писателей, но азы стиля, безусловно, можно научить. Точно так же «хорошее регулярное выражение» нелегко поместить в правила, и, возможно, именно поэтому я никогда не видел литературы по этому вопросу.Тем интереснее попробовать.

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

    Перед тем, как погрузиться в элементы Elements of Regex Style , давайте поговорим о стратегии сопоставления.

    (прямая ссылка)

    Следует сопоставить или захватить?

    Матчи не священны. Смело выбрасывайте их!

    Одна тема, которую я никогда не видел (но, возможно, я читаю недостаточно широко и внимательно), — это различные доступные вам стратегии для получения необходимых данных. Стоит ли попытаться сопоставить это? Стоит ли попытаться его запечатлеть? Это неявный вопрос почти в каждой сложной части регулярного выражения, которую вы пишете.

    В примерах на этом сайте вы увидите разнообразное использование сопоставления и захвата. Иногда совпадение возвращает именно те данные, которые нам нужны. Но часто совпадение — это «выброс», который просто подводит нас к нужным нам частям, которые мы затем фиксируем.

    Иногда захваченные группы содержат данные, которые нам нужны. Но в других случаях вы используете только группы (и обратные ссылки) для построения замысловатого выражения, которое добавляет к общему совпадению, которое вы ищете.

    Если это звучит сбивающе с толку, это не должно быть так. Вам нужно сказать себе только одно:

    Совпадение — это еще одна группа захвата

    В принципе, вы можете представить себе, что все ваше регулярное выражение заключено в круглые скобки. Эти скобки подразумеваются. Они захватывают группу 0, которую мы условно называем «совпадением».

    На самом деле, ваш язык может уже так думать.В PHP, если $ match — это массив совпадений, $ match [1] будет содержать группу 1, $ match [2] будет содержать группу 2… и $ match [0] («Группа 0» ) будет содержать общее совпадение. Точно так же в JavaScript полное совпадение будет в matchArray [0] . В Python и C # вы можете (хотя это не единственные варианты) получить общее совпадение как match.group (0) и matchResult.Groups [0] .Value .

    Аналогично, в операциях замены регулярных выражений \ 1, \ 2, \ 3 (или $ 1, $ 2, $ 3, в зависимости от типа) обычно относятся к группам захвата 1, 2 и 3.Не случайно \ 0 ($ 0) обычно относятся к общему совпадению.

    Как только вы увидите, что совпадение — это просто другая группа, вопрос о том, совпадать или захватывать, теряет важность: вы все равно будете захватывать.

    Что это значит? Вы тот, кто знает, с какими данными вы хотите сопоставить. Зная это, используйте любые средства, которые вам нужны (будь то общий матч или скрытый захват в Группе 3), чтобы захватить то, что вы хотите. В примере о том, как синхронизировать регулярное выражение с вашей строкой, мы рассмотрим технику, которая делает много захватов — некоторые полезные, некоторые нет, — а затем оставляет это коду вне регулярного выражения, чтобы решить, какие из групп захвата важны. .Это не особенно эффективный метод, но он работает.

    Единственная модерация, которую я бы добавил к совету «использовать любые средства, которые вам нужны», — это то, что обычно считается плохой практикой программирования создавать ненужные группы захвата, поскольку они создают накладные расходы. Поэтому, если вам нужны круглые скобки для оценки выражения, но нет необходимости в захвате данных, сделайте его не захватывающей группой, используя синтаксис (?:…) .

    (прямая ссылка)

    Следует

    Разделить или Соответствовать всем ?

    Вот аксиома регулярного выражения, которая может вас удивить:

    Совпадение всего и Разделение — две стороны одной медали.

    Рассмотрим список фруктов, разделенных словом «и»: яблоко и банан и апельсин и груша и вишня. Вас интересует получение массива со всеми названиями фруктов. Для этого вы можете сопоставить все слова, отличные от и (подойдет что-то вроде \ b (?! И) \ S + ). Другой подход — разделить строку с помощью разделителя «и». Оба подхода предоставят вам один и тот же массив: это немного похоже на один из тех рисунков, которые можно интерпретировать по-разному, в зависимости от того, сосредоточены ли вы на белом фоне или на частях с чернилами.

    Когда ты захочешь подойти, я тебя разделю … Когда ты захочешь разделиться, я тебя поделю …

    Это простой пример, но часто вы получите значительное преимущество, решив сопоставить, а не разделить, или наоборот. Вы часто обнаруживаете, что один путь прост, а другой почти невозможен. Поэтому, если кто-то говорит вам «Я хочу сопоставить все…» или «Я пытаюсь разделить на …», постарайтесь не спешить по первому переулку, потому что они сказали «разделить» или «сопоставить»: запомните другую сторону монета.

    (прямая ссылка)

    Элементы стиля Regex

    В мире регулярных выражений уместно перефразировать Strunk & White:

    Чтобы написать хорошее регулярное выражение, скажите то, что вы имеете в виду. Скажите это четко.

    Чем конкретнее ваши выражения, тем быстрее будет соответствовать ваше регулярное выражение; и, что более важно, тем быстрее ваше регулярное выражение выйдет из строя, если совпадения не будет найдено.

    Вот несколько «золотых правил», которые должен помнить каждый специалист по регулярным выражениям.и $. У большинства движков есть другие полезные встроенные якоря, такие как \ A и \ G (см. Шпаргалку).

    (прямая ссылка)
    Когда знаешь, чего хочешь, говори. Когда знаешь, чего не хочешь, тоже говори!
    Когда вы вводите в свой движок регулярных выражений много. * «Точечно-звездного супа», он может тратить много энергии, бегая по строке, а затем возвращаясь. Будьте как можно более конкретными, используя литеральный символ B, класс цифр \ d или границу \ b.»] … цифра: \ D … или чтобы следующие три буквы были» бу «: (?! Бу) [аз-я] {3} .

    (прямая ссылка)
    Прекрасный контраст — используйте его.
    По возможности используйте следующие друг за другом токены, которые исключают друг друга, чтобы создать контраст. Это уменьшает необходимость в обратном прослеживании и необходимость в границах в широком смысле этого слова, в который я включаю поисковые пути. Например, предположим, что вы пытаетесь проверить строки, содержащие ровно три цифры, расположенные в конце, как в ABC123 .a-z] и [a-z]. Это вариант . Когда вы знаете, чего хотите, скажите .

    (прямая ссылка)
    Хотите лениться? Подумать дважды.
    Допустим, вы хотите сопоставить все символы в фигурных скобках. Сначала вы можете подумать о {. *?} , потому что ленивый квантификатор гарантирует, что вы не перескочите за закрывающую скобку. Однако у ленивого квантификатора есть издержки: на каждом шаге внутри фигурных скобок движок сначала пробует ленивый вариант (не соответствует ни одному символу), затем пытается сопоставить следующий токен (закрывающую фигурную скобку), а затем должен выполнить возврат.}] *} . Это вариант Используйте контраст и Если вы знаете, чего хотите, скажите это.

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

    (прямая ссылка)
    По краям: действительно нужны границы или разделители? Используйте их или сделайте своими!
    Большинство механизмов регулярных выражений предоставляют границу \ b, а иногда и другие, которые могут быть полезны для проверки края подстроки. В зависимости от движка могут быть доступны другие границы, но зачем на этом останавливаться? В правильном контексте я верю в границ DIY .Например, используя поисковые запросы, вы можете создать границу для проверки изменений с верхнего на нижний регистр, что может быть полезно для разделения строки CamelCase: (? <= [Az]) (? = [AZ]) Однако не злоупотребляйте границами, потому что хороший контраст часто делает их излишними (см. Использовать контраст .)

    (прямая ссылка)
    Не отказывайся от того, чем можешь владеть.
    Атомарные группы (?>…) И тесно связанные притяжательные кванторы могут сэкономить вам много времени на поиск с возвратом.Структурированные данные часто дают вам возможность включить их в ваши выражения.

    (прямая ссылка)
    Не совмещайте то, что легко разделяется, и не разделяйте то, что хорошо сочетается.
    Я объяснил этот момент в разделе о разделении и сопоставлении.

    (прямая ссылка)
    Дизайн на поражение.
    Как известно Шекспир, «Любой дурак может написать регулярное выражение, которое соответствует тому, что он должен найти. Требуется гений, чтобы написать регулярное выражение, которое заранее знает, что его миссия потерпит неудачу.« Возьмите (? =. * Блох). * . Он выполняет разумную работу по сопоставлению строк, содержащих блох . Но что из строк, в которых нет блох ? В самом начале строки, механизм просматривает всю строку вниз. Предварительный просмотр не выполняется, механизм регулярных выражений перемещается на вторую позицию в строке и снова ищет блох на всем протяжении строки. (? =.* блохи). * . Единственное отличие — это привязка каретки. Это не выглядит большой проблемой, но как только движок не может найти блох в начале строки, он останавливается, потому что опережающий просмотр привязан к началу. Этот шаблон предназначен для отказа, и он намного более эффективен — O (N) по сравнению с O (N 2 ) для первого.

    (прямая ссылка)
    Доверьтесь Dot-Star, чтобы довести вас до конца линии
    Со всеми предостережениями против точки-звезды, вот один из многих случаев, когда она может быть полезна.В строке, такой как @ABC @DEF , предположим, вы хотите сопоставить последний токен, который начинается с @ , но только если имеется более одного токена. Если вам просто нужен последний, вы можете использовать якорь: @ [A-Z] + $ … но он будет соответствовать токену, даже если он единственный в строке. Вы можете подумать об использовании опережающего просмотра: @ [A-Z]. * \ K @ [A-Z] + (?!. * @ [A-Z]) . Однако в этом нет необходимости, потому что жадный. * Уже гарантирует вам, что вы получаете последний токен! Точка-звезда соответствует полностью до конца строки, затем выполняется возврат, но только до тех пор, пока это необходимо: вы можете упростить это до @ [A-Z].* \ K @ [A-Z] + Доверьтесь точке-звезде, которая проведет вас до конца очереди!

    (прямая ссылка)

    Два мнемонических устройства для проверки ваших регулярных выражений

    Жадные атомы снова заякориваются.

    До тех пор, пока вы не приобретете много практики, вероятно, невозможно будет одновременно учитывать все эти правила. Но лучше запомнить несколько, чем ничего не запоминать, поэтому, если вы только начинаете, могу ли я предложить простую фразу, чтобы напомнить себе о хитростях, которые могут улучшить выражение?

    Жадные атомы снова закрепляются.

    ✽ «Жадный» напоминает вам проверить, не следует ли делать некоторые жадные квантификаторы ленивыми, и наоборот. Это также напоминает вам о снижении производительности ленивых квантификаторов (возврат на каждом шаге) и о возможных обходных путях.
    ✽ «Атомы» напоминают вам проверить, следует ли сделать некоторые части выражения атомарными (или использовать притяжательный квантификатор).
    ✽ «Якорь» напоминает вам проверить, должно ли выражение быть привязано. В более широком смысле, это может напоминать вам о границах и о том, нужно ли их добавлять или удалять.
    ✽ «Снова» напоминает вам проверить, могут ли части выражения использовать синтаксис повторяющегося подшаблона.

    Если вы предпочитаете короткие мнемонические устройства, вы можете предпочесть аббревиатуру AGRA , полезную для построения Тадж-Махала регулярных выражений и названную в честь индийского города Агра, наиболее известного благодаря Тадж-Махалу:

    A для якоря
    G для Greed
    R для повтора
    A для Atomic


    Все, что вы всегда хотели знать о
    много частей синтаксиса регулярных выражений, которые
    начать с букв (?

    Regexp Tutorial — Сокращенные классы символов

    Поскольку определенные классы символов используются часто, доступен ряд сокращенных классов символов.\ d — это сокращение от [0-9]. В большинстве разновидностей, поддерживающих Unicode, \ d включает все цифры из всех скриптов. Заметными исключениями являются Java, JavaScript и PCRE. Эти разновидности Unicode соответствуют только цифрам ASCII с \ d.

    \ w означает «словесный символ». Он всегда соответствует символам ASCII [A-Za-z0-9_]. Обратите внимание на наличие символа подчеркивания и цифр. В большинстве разновидностей, поддерживающих Unicode, \ w включает много символов из других скриптов. Есть много противоречий в том, какие символы на самом деле включены.Буквы и цифры из алфавитных шрифтов и идеограмм обычно включаются. Знаки препинания соединителя, отличные от подчеркивания и числовых символов, которые не являются цифрами, могут быть включены или не включены. XML Schema и XPath даже включают все символы в \ w. Опять же, Java, JavaScript и PCRE сопоставляют только символы ASCII с \ w.

    \ s означает «пробельный символ». Опять же, какие символы сюда входят, зависит от вкуса регулярного выражения. Во всех вариантах, обсуждаемых в этом руководстве, он включает [\ t \ r \ n \ f].То есть: \ s соответствует пробелу, табуляции, возврату каретки, переводу строки или переводу страницы. Большинство разновидностей также включают вертикальную вкладку, за исключением Perl (до версии 5.18) и PCRE (до версии 8.34). В версиях, поддерживающих Unicode, \ s обычно включает все символы из категории «разделитель» Unicode. Java и PCRE снова являются исключениями. Но JavaScript сопоставляет все пробелы Unicode с \ s.

    Сокращенные классы символов могут использоваться как внутри, так и вне квадратных скобок.\ d \ s]. Последний соответствует любому символу, который не является ни цифрой, ни пробелом. Он соответствует x, но не 8. Первый, однако, соответствует любому символу, который либо не является цифрой, либо не является пробелом. Поскольку все цифры не являются пробелами, и все символы пробелов не являются цифрами, [\ D \ S] соответствует любому символу; цифра, пробел или иное.

    Дополнительные классы сокращенных символов

    Хотя поддержка \ d, \ s и \ w довольно универсальна, существуют некоторые разновидности регулярных выражений, которые поддерживают дополнительные классы сокращенных символов.Perl 5.10 представил \ h и \ v. \ h соответствует горизонтальному пробелу, который включает табуляцию и все символы в категории Unicode «разделитель пробелов». Это то же самое, что и [\ t \ p {Zs}]. \ v соответствует «вертикальному пробелу», который включает все символы, рассматриваемые как разрывы строк в стандарте Unicode. Это то же самое, что и [\ n \ cK \ f \ r \ x85 \ x {2028} \ x {2029}].

    PCRE также поддерживает \ h и \ v, начиная с версии 7.2. PHP поддерживает версию 5.2.2, Java — версию 8, а механизм JGsoft — версию 2.

    Если ваш вариант поддерживает \ h и \ v, вам определенно следует использовать их вместо \ s, когда вы хотите сопоставить только один тип пробелов. Использование \ h вместо \ s для сопоставления пробелов и табуляции гарантирует, что совпадение вашего регулярного выражения случайно не попадет в следующую строку.

    Во многих других разновидностях регулярных выражений \ v соответствует только символу вертикальной табуляции. Perl, PCRE и PHP никогда этого не поддерживали, поэтому они могли придавать \ v другое значение. Java 4–7 и JGsoft V1 действительно использовали \ v для соответствия только вертикальной табуляции.Java 8 и JGsoft V2 все равно изменили значение этого токена. Вертикальная табуляция также является вертикальным пробелом. Чтобы избежать путаницы, в приведенном выше абзаце используется \ cK для представления вертикальной табуляции.

    Boost поддерживает \ h, начиная с версии 1.42. Boost 1.42 и более поздние версии поддерживают \ v как сокращение только вне классов символов. [\ v] соответствует только вертикальной табуляции в Boost.

    Ruby 1.9 и более поздние версии имеют собственную версию \ h. Он соответствует одной шестнадцатеричной цифре точно так же, как [0-9a-fA-F].\ v — это вертикальная вкладка в Ruby.

    Классы символов XML

    Регулярные выражения XML Schema, XPath и JGsoft V2 поддерживают еще четыре сокращения, которые не поддерживаются никакими другими разновидностями регулярных выражений. \ i соответствует любому символу, который может быть первым символом имени XML. \ c соответствует любому символу, который может стоять после первого символа в имени XML. \ I и \ C — соответствующие сокращенные обозначения. Обратите внимание, что сокращенный синтаксис \ c конфликтует с синтаксисом управляющих символов, используемым во многих других разновидностях регулярных выражений.’] *’)) * | / \ i \ c *) \ s *> соответствует либо открывающему тегу с атрибутами, либо закрывающему тегу.

    Никакие другие разновидности регулярных выражений, обсуждаемые в этом руководстве, не поддерживают классы символов XML. Если ваши XML-файлы представляют собой обычный ASCII, вы можете использовать [_: A-Za-z] для \ i и [-._: A-Za-z0-9] для \ c. Если вы хотите разрешить использование всех символов Unicode, которые допускаются стандартом XML, вы получите довольно длинные регулярные выражения. Вам нужно будет использовать [: A-Z_a-z \ u00C0- \ u00D6 \ u00D8- \ u00F6 \ u00F8- \ u02FF \ u0370- \ u037D \ u037F- \ u1FFF \ u200C- =
    \ u2070- \ u218F \ u2C00 — \ u2FEF \ u3001- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFFD] вместо \ i и [-.0-9: A-Z_a-z \ u00B7 \ u00C0- \ u00D6 \ u00D8- \ u00F6 \ u00F8- \ u037D \ u037F- \ u1FFF \ u200C- \ u200D
    \ u203F \ u2040 \ u2070- \ u218F \ u2C00- u2FEF \ u3001- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFFD] вместо \ c.

    Сделайте пожертвование

    Этот веб-сайт только что сэкономил вам поездку в книжный магазин? Сделайте пожертвование в поддержку этого сайта, и вы получите пожизненного доступа без рекламы к этому сайту!

    Язык регулярных выражений — Краткий справочник

    • 11 минут на чтение

    В этой статье

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

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

    Мы также предоставили эту информацию в двух форматах, которые вы можете скачать и распечатать для удобства:

    Побег персонажа

    Символ обратной косой черты (\) в регулярном выражении указывает, что следующий за ним символ либо является специальным символом (как показано в следующей таблице), либо должен интерпретироваться буквально.Для получения дополнительной информации см. Побеги персонажей.

    Экранированный символ Описание Узор совпадений
    \ a Соответствует символу колокольчика, \ u0007. \ а "\ u0007" в "Ошибка!" + '\ u0007'
    \ б В классе символов соответствует символу возврата \ u0008. [\ b] {3,} "\ b \ b \ b \ b" дюйм "\ b \ b \ b \ b"
    \ т Соответствует табуляции, \ u0009. (\ ш +) \ т "item1 \ t" , "item2 \ t" дюйм "item1 \ titem2 \ t"
    \ r Соответствует возврату каретки, \ u000D. ( \ r не эквивалентно символу новой строки, \ n .) \ r \ n (\ w +) "\ r \ nЭто" в "\ r \ nЭто \ nдве строки."
    \ v Соответствует вертикальной табуляции, \ u000B. [\ v] {2,} "\ v \ v \ v" в "\ v \ v \ v"
    \ f Соответствует подаче страницы, \ u000C. [\ f] {2,} "\ f \ f \ f" дюйм "\ f \ f \ f"
    \ п Соответствует новой строке, \ u000A. \ r \ n (\ w +) "\ r \ nЭто" в "\ r \ nЭто \ nдве строки."
    \ e Соответствует побегу, \ u001B. \ e "\ x001B" дюйм "\ x001B"
    \ nnn Использует восьмеричное представление для указания символа ( nnn состоит из двух или трех цифр). \ ш \ 040 \ ш "a b" , "c d" в "a bc d"
    \ x nn Использует шестнадцатеричное представление для указания символа ( nn состоит ровно из двух цифр). \ ш \ х20 \ ш "a b" , "c d" в "a bc d"
    \ c X

    \ c x

    Соответствует управляющему символу ASCII, указанному как X или x , где X или x — это буква управляющего символа. \ cC "\ x0003" дюйм "\ x0003" (Ctrl-C)
    \ u nnnn Соответствует символу Юникода с использованием шестнадцатеричного представления (ровно четыре цифры, как представлено nnnn ). \ w \ u0020 \ w "a b" , "c d" в "a bc d"
    \ Если за ним следует символ, который не распознается как экранированный в этой и других таблицах этого раздела, соответствует этому символу. Например, \ * совпадает с \ x2A и \. совпадает с \ x2E . Это позволяет обработчику регулярных выражений устранять неоднозначность языковых элементов (таких как * или?) И символьных литералов (представленных \ * или \? ). \ d + [\ + - x \ *] \ d + "2 + 2" и "3 * 9" в "(2 + 2) * 3 * 9"

    Классы символов

    Класс символов соответствует любому из набора символов. Классы символов включают языковые элементы, перечисленные в следующей таблице. Для получения дополнительной информации см. Классы символов.

    Класс символов Описание Узор совпадений
    [ группа_знаков ] Соответствует любому одиночному символу в character_group .aei] "r" , "g" , "n" в "царствование"
    [ первая - последняя ] Диапазон символов: соответствует любому одиночному символу в диапазоне от первых до последних . [А-Я] "A" , "B" в "AB123"
    . Подстановочный знак: соответствует любому одиночному символу, кроме \ n.

    Чтобы соответствовать буквальному символу точки (. Или \ u002E ), перед ним должен стоять escape-символ ( \. ).

    а.е. «пр.» в «неф»

    «съел» в «вода»

    \ p { название } Соответствует любому одиночному символу в общей категории Unicode или именованному блоку, заданному name . \ p {Lu}

    \ p {IsCyrillic}

    «C» , «L» в «City Lights»

    «Д» , «Ж» в «ДЖem»

    \ P { название } Соответствует любому одиночному символу, который не входит в общую категорию Unicode или именованный блок, указанный в name . \ P {Lu}

    \ P {IsCyrillic}

    «i» , «t» , «y» в «Город»

    «e» , «m» в «ДЖem»

    \ w Соответствует любому символу слова. \ w "I" , "D" , "A" , "1" , "3" в "ID A1.3"
    \ W Соответствует любому символу, не являющемуся словом. \ Вт "" , "." дюйм "ID A1.3"
    \ с Соответствует любому символу пробела. \ Вт \ с "D" дюйм "ID A1.3"
    \ S Соответствует любому символу, отличному от пробела. \ s \ S "_" дюйм "int __ctr"
    \ d Соответствует любой десятичной цифре. \ д "4" дюйм "4 = IV"
    \ D Соответствует любому символу, кроме десятичной цифры. \ D "" , "=" , "" , "I" , "V" в "4 = IV"

    Анкеры

    Якоря или атомарные утверждения нулевой ширины приводят к успешному или неудачному совпадению в зависимости от текущей позиции в строке, но они не заставляют движок продвигаться по строке или потреблять символы.\ d {3} "901" в "901-333-" $ По умолчанию совпадение должно происходить в конце строки или перед \ n в конце строки; в многострочном режиме он должен находиться до конца строки или до \ n в конце строки. - \ d {3} долл. США "-333" дюйм "-901-333" \ A Соответствие должно происходить в начале строки. \ A \ d {3} "901" в "901-333-" \ Z Соответствие должно происходить в конце строки или перед \ n в конце строки. - \ d {3} \ Z "-333" дюйм "-901-333" \ z Соответствие должно находиться в конце строки. - \ d {3} \ z "-333" дюйм "-901-333" \ G Матч должен произойти в точке, где закончился предыдущий матч. \ G \ (\ d \) "(1)" , "(3)" , "(5)" в "(1) (3) (5) [7] (9)" \ б Соответствие должно происходить на границе между \ w (буквенно-цифровым) и \ W (не буквенно-цифровым) символом. \ b \ w + \ s \ w + \ b "их тема" , "их им" в "их тема их" \ B Совпадение не должно происходить на границе \ b . \ Изгиб \ w * \ b "конец" , "конец" в "конец отправляет постоянный кредитор"

    Конструкции группирования

    Группирующие конструкции очерчивают подвыражения регулярного выражения и обычно захватывают подстроки входной строки. Группирующие конструкции включают языковые элементы, перечисленные в следующей таблице. Для получения дополнительной информации см. Группирующие конструкции.

    Группирующий конструкт Описание Узор совпадений
    ( подвыражение ) Захватывает совпавшую часть выражения и присваивает ей порядковый номер, отсчитываемый от единицы. (\ ш) \ 1 "ее" дюйм "глубина"
    (? < имя > подвыражение )
    или
    (? ' имя ' подвыражение )
    Захватывает совпадающее подвыражение в именованную группу. (? <Двойной> \ w) \ k <двойной> "ее" дюйм "глубина"
    (? < name1 - name2 > подвыражение )
    или
    (? ' name1 -

    имя2 )

    Определяет определение балансирующей группы.((1-3) * (3-1)) «
    (?: подвыражение ) Определяет группу без захвата. Запись (?: Строка)? «WriteLine» в «Console.WriteLine ()»

    «Запись» в «Console.Write (значение)»

    (? Imnsx-imnsx: подвыражение ) Применяет или отключает указанные параметры в подвыражении .Для получения дополнительной информации см. Параметры регулярного выражения. A \ d {2} (? I: \ w +) \ b "A12xl" , "A12XL" дюйм "A12xl A12XL a12xl"
    (? = подвыражение ) Утверждение положительного просмотра вперед нулевой ширины. \ b \ w + \ b (? =. + И. +) «кошки» , «собаки»
    в
    «кошки, собаки и некоторые мыши».
    (?! подвыражение ) Утверждение отрицательного просмотра вперед нулевой ширины. \ b \ w + \ b (?!. + И. +) "и" , "некоторые" , "мыши"
    в
    "кошки, собаки и некоторые мыши".
    (? <= подвыражение ) Утверждение положительного просмотра назад нулевой ширины. \ b \ w + \ b (? <=. + И. +)

    ———————————

    \ b \ w + \ b (? <=. + And. *)

    «некоторые» , «мыши»
    в
    «кошки, собаки и некоторые мыши."
    ————————————
    " и ", " некоторые ", " мыши "
    в
    " кошки, собаки и некоторые мыши "
    (? подвыражение ) Утверждение отрицательного просмотра назад нулевой ширины. \ b \ w + \ b (?

    ———————————

    \ b \ w + \ b (?

    "кошки" , "собаки" , "и"
    в
    "кошки, собаки и некоторые мыши."
    ————————————
    « ​​кошки », « ​​собаки »
    в
    « ​​кошки, собаки и некоторые мыши ».
    (?> подвыражение ) Атомная группа. (?> A | ab) c "ac" дюйм "ac"

    ничего дюйм "abc"

    Краткий обзор

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

    Обзор Имя Функция
    (? = Чек) Положительный взгляд вперед Утверждает, что за текущей позицией в строке следует "проверка".
    (? <= Чек) Положительный взгляд назад Утверждает, что то, что непосредственно предшествует текущей позиции в строке, - это «проверка».
    (?! Проверить) Отрицательный взгляд вперед Утверждает, что то, что следует непосредственно за текущей позицией в строке, не является «проверкой».
    (? Отрицательный взгляд назад Утверждает, что то, что непосредственно предшествует текущей позиции в строке, не является "проверкой".

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

    Кванторы

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

    Квантификатор Описание Узор совпадений
    * Соответствует предыдущему элементу ноль или более раз. \ д * \. \ Д ".0" , "19.9" , "219.9"
    + Один или несколько раз соответствует предыдущему элементу. "be +" «пчела» в «была» , «была» в «изогнутая»
    ? Соответствует предыдущему элементу ноль или один раз. "рай? Н" «побежал» , «дождь»
    { n } Соответствует предыдущему элементу точно n раз. ", \ d {3}" ", 043" дюйм "1043,6" , ", 876" , ", 543" и ", 210" дюйм "9 876 543 210"
    { n ,} Соответствует предыдущему элементу не менее n раз. "\ d {2,}" "166" , "29" , "1930"
    { n , m } Соответствует предыдущему элементу не менее n раз, но не более m раз. "\ d {3,5}" "166" , "17668"

    "19302" в "1"

    *? Соответствует предыдущему элементу ноль или более раз, но как можно меньшее количество раз. \ d *? \. \ D ".0" , "19.9" , "219.9"
    +? Соответствует предыдущему элементу один или несколько раз, но как можно меньше раз. "быть +?" "быть" в "было" , "быть" в "изогнуто"
    ?? Соответствует предыдущему элементу ноль или один раз, но как можно меньше раз. "рай ?? н" «побежал» , «дождь»
    { n }? Соответствует предыдущему элементу точно n раз. ", \ d {3}?" ", 043" дюйм "1043,6" , ", 876" , ", 543" и ", 210" дюйм "9 876 543 210"
    { n ,}? Соответствует предыдущему элементу как минимум n раз, но как можно меньше раз. "\ d {2,}?" "166" , "29" , "1930"
    { n , m }? Соответствует предыдущему элементу между n и m раз, но как можно меньшее количество раз. "\ d {3,5}?" "166" , "17668"

    "193" , "024" в "1"

    Конструкции обратных ссылок

    Обратная ссылка позволяет впоследствии идентифицировать ранее сопоставленное подвыражение в том же регулярном выражении. В следующей таблице перечислены конструкции обратной ссылки, поддерживаемые регулярными выражениями в .NET. Для получения дополнительной информации см. Конструкции обратных ссылок.

    Конструкция обратной ссылки Описание Узор совпадений
    \ номер Обратная ссылка. Соответствует значению пронумерованной части выражения. (\ ш) \ 1 "ее" в "искать"
    \ k < название > Именованная обратная ссылка. Соответствует значению именованного выражения. (? \ w) \ k "ее" в "искать"

    Конструкции чередования

    Конструкции с чередованием изменяют регулярное выражение, чтобы включить или / или сопоставление. Эти конструкции включают языковые элементы, перечисленные в следующей таблице. Для получения дополнительной информации см. Альтернативные конструкции.

    Чередование конструкции Описание Узор совпадений
    | Соответствует любому элементу, разделенному вертикальной чертой ( | ). -е (e | is | at) ", " это " в " это день ".
    (? ( выражение ) да | нет ) Соответствует да , если соответствует шаблон регулярного выражения, обозначенный выражением ; в противном случае соответствует необязательной части . Выражение интерпретируется как утверждение нулевой ширины. (? (A) A \ d {2} \ b | \ b \ d {3} \ b) "A10" , "910" дюйм "A10 C103 910"
    (? ( название ) да | нет ) Соответствует да , если имя , именованная или пронумерованная группа захвата, имеет совпадение; в противном случае соответствует необязательному . (? <Кавычки> ")? (? (Цитируется).+? "| \ S + \ s) "Dogs.jpg" , "\" Yiska plays.jpg \ "" в "Dogs.jpg \" Yiska plays.jpg \ ""

    Замены

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

    Характер Описание Узор Схема замены Входная строка Строка результата
    $ номер Заменяет подстроку, соответствующую номеру группы . \ b (\ w +) (\ s) (\ w +) \ b $ 3 $ 2 $ 1 "один два" "два и один"
    $ { название } Заменяет подстроку, соответствующую названной группе на имя . \ b (? \ w +) (\ s) (? \ w +) \ b $ {word2} $ {word1} "один два" "два и один"
    $$ Заменяет буквальный символ "$". \ b (\ d +) \ s? долларов США $$$ 1 «103 долл. США» "103 доллара"
    $ и Заменяет копию всего матча. \ $? \ D * \.? \ D + ** $ и ** "1,30 доллара" "** 1,30 доллара США **"
    $ Заменяет весь текст входной строки перед совпадением. Б + $ «AABBCC» "AAAACC"
    $ Заменяет весь текст входной строки после совпадения. Б + $ «AABBCC» "AACCCC"
    $ + Заменяет последнюю захваченную группу. В + (С +) $ + "AABBCCDD" "AACCDD"
    $ _ Заменяет всю входную строку. Б + $ _ «AABBCC» «AAAABBCCCC»

    Параметры регулярных выражений

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

    Вы можете указать встроенный параметр двумя способами:

    • При использовании разной конструкции (? Imnsx-imnsx) , где знак минус (-) перед параметром или набором параметров отключает эти параметры. Например, (? I-mn) включает сопоставление без учета регистра ( i ), выключает многострочный режим ( m ) и отключает захват групп без имени ( n ).Параметр применяется к шаблону регулярного выражения с точки, в которой параметр определен, и действует либо до конца шаблона, либо до точки, где другая конструкция меняет значение параметра на противоположное.
    • С помощью конструкции группирования (? Imnsx-imnsx: подвыражение ) , которая определяет параметры только для указанной группы.

    Механизм регулярных выражений .NET поддерживает следующие встроенные параметры:

    Опция Описание Узор совпадений
    i Использовать сопоставление без учета регистра. и $ соответствуют началу и концу строки, а не началу и концу строки. Для примера см. Раздел «Многострочный режим» в параметрах регулярных выражений.
    n Не захватывайте безымянные группы. Для примера см. Раздел «Только явные захваты» в параметрах регулярного выражения.
    с Использовать однострочный режим. Для примера см. Раздел «Однострочный режим» в параметрах регулярных выражений.
    x Игнорировать неэкранированные пробелы в шаблоне регулярного выражения. \ b (? X) \ d + \ s \ w + "1 трубкозуб" , "2 кошки" в "1 трубкозуб 2 кошки IV центурионы"

    Разные конструкции

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

    Построить Определение Пример
    (? Imnsx-imnsx) Устанавливает или отключает такие параметры, как нечувствительность к регистру в середине шаблона. Дополнительные сведения см. В разделе Параметры регулярных выражений. \ bA (? I) b \ w + \ b соответствует «ABA» , «Able» в «ABA Able Act»
    (? # комментарий ) Встроенный комментарий.Комментарий заканчивается первой закрывающей круглой скобкой. \ bA (? # Соответствует словам, начинающимся с A) \ w + \ b
    # [до конца строки] Комментарий в X-режиме. Комментарий начинается с неэкранированного # и продолжается до конца строки. (? X) \ bA \ w + \ b # Соответствует словам, начинающимся с A

    См. Также

    предопределенных классов символов (Руководства по Java ™> Основные классы> Регулярные выражения)

    Учебники по Java были написаны для JDK 8.Примеры и методы, описанные на этой странице, не используют улучшений, представленных в более поздних версиях, и могут использовать технологии, которые больше не доступны.
    Обзор обновленных языковых функций в Java SE 9 и последующих выпусках см. В разделе «Изменения языка Java».
    См. Примечания к выпуску JDK для получения информации о новых функциях, улучшениях, а также удаленных или устаревших параметрах для всех выпусков JDK.

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

    Конструкция Описание
    .\ w]

    В приведенной выше таблице каждая конструкция в левом столбце является сокращением для класса символов в правом столбце. Например, \ d означает диапазон цифр (0–9), а \ w означает символ слова (любая строчная буква, любая прописная буква, символ подчеркивания или любая цифра). По возможности используйте предопределенные классы. Они упрощают чтение кода и устраняют ошибки, вызванные искаженными классами символов.

    Конструкции, начинающиеся с обратной косой черты, называются экранированными конструкциями .Мы предварительно просмотрели экранированные конструкции в
    Раздел String Literals, где мы упомянули использование обратной косой черты и \ Q и \ E для цитаты. Если вы используете экранированную конструкцию в строковом литерале, вы должны поставить перед обратной косой чертой другую обратную косую черту для компиляции строки. Например:

    закрытая конечная строка REGEX = "\\ d"; // одна цифра
     

    В этом примере \ d - регулярное выражение; дополнительная обратная косая черта требуется для компиляции кода.Однако тестовая программа считывает выражения непосредственно из консоли , поэтому дополнительная обратная косая черта не нужна.

    Следующие примеры демонстрируют использование предопределенных классов символов.

    Введите свое регулярное выражение:.
    Введите строку ввода для поиска: @
    Я нашел текст «@», начинающийся с индекса 0 и заканчивающийся индексом 1.
    
    Введите свое регулярное выражение:.
    Введите строку ввода для поиска: 1
    Я нашел текст «1», начинающийся с индекса 0 и заканчивающийся индексом 1.
    
    Введите свое регулярное выражение:.
    Введите строку ввода для поиска: a
    Я нашел текст «а», начинающийся с индекса 0 и заканчивающийся индексом 1.Введите ваше регулярное выражение: \ d
    Введите строку ввода для поиска: 1
    Я нашел текст «1», начинающийся с индекса 0 и заканчивающийся индексом 1.
    
    Введите ваше регулярное выражение: \ d
    Введите строку ввода для поиска: a
    Совпадений не найдено.
    
    Введите ваше регулярное выражение: \ D
    Введите строку ввода для поиска: 1
    Совпадений не найдено.
    
    Введите ваше регулярное выражение: \ D
    Введите строку ввода для поиска: a
    Я нашел текст «а», начинающийся с индекса 0 и заканчивающийся индексом 1.
    
    Введите ваше регулярное выражение: \ s
    Введите строку ввода для поиска:
    Я нашел текст "", начинающийся с индекса 0 и заканчивающийся индексом 1.
    
    Введите ваше регулярное выражение: \ s
    Введите строку ввода для поиска: a
    Совпадений не найдено.Введите ваше регулярное выражение: \ S
    Введите строку ввода для поиска:
    Совпадений не найдено.
    
    Введите ваше регулярное выражение: \ S
    Введите строку ввода для поиска: a
    Я нашел текст «а», начинающийся с индекса 0 и заканчивающийся индексом 1.
    
    Введите ваше регулярное выражение: \ w
    Введите строку ввода для поиска: a
    Я нашел текст «а», начинающийся с индекса 0 и заканчивающийся индексом 1.
    
    Введите ваше регулярное выражение: \ w
    Введите строку ввода для поиска:!
    Совпадений не найдено.
    
    Введите ваше регулярное выражение: \ W
    Введите строку ввода для поиска: a
    Совпадений не найдено.
    
    Введите ваше регулярное выражение: \ W
    Введите строку ввода для поиска:!
    Я нашел текст "!" начиная с индекса 0 и заканчивая индексом 1.

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

    • \ d соответствует всем цифрам
    • \ s соответствует пробелам
    • \ w соответствует символам слова

    В качестве альтернативы заглавная буква означает обратное:

    • \ D соответствует не цифрам
    • \ S соответствует непробелам
    • \ W соответствует символам, отличным от слов

    .

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    2024 © Все права защищены. Карта сайта