Регулярные выражения 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 | Находит |
---|---|
foobar | foobar |
Непечатные символы (escape-коды)
Для представления непечатаемого символа в регулярном выражении используется \x
с шестнадцатеричным кодом. Если код длиннее 2 цифр (более U+00FF), то он обрамляется в фигурные скобки.
RegEx | Находит |
---|---|
\xAB | символ с 2-значным шестнадцатеричным кодом AB |
\x{AB20} | символ с 1-4 значным шестнадцатеричным кодом AB20 |
foo\x20bar | foo bar (обратите внимание на пробел в середине) |
Существует ряд предопределенных escape-кодов
для непечатных символов, как в языке C
:
RegEx | Находит | |
---|---|---|
\t | tab (HT/TAB), тоже что \x09 | |
\n | символ новой строки (LF), то же что \x0a | |
\r | возврат каретки (CR), тоже что \x0d | |
\f | form feed (FF), то же что \x0c | |
\a | звонок (BEL), тоже что \x07 | |
\e | escape (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 Если вы предпочитаете математически правильное описание, вы можете найти его на сайте www.unicode.org. Разделители слов
Граница слова ПовторыПовторЗа любым элементом регулярного выражения может следовать допустимое число повторений элемента.
То есть цифры в фигурных скобках
Теоретически значение n и m не ограничены (можно использовать максимальное значение для 32-х битного числа).
ЖадностьПовторы в По умолчанию все повторы являются Для строки
Вы можете переключить все повторы в
Сверхжадные повторы (Possessive Quantifier)Синтаксис: Полное описание (на английском) Вкратце, сверхжадный повтор ускоряет работу в сложных случаях. АльтернативыВыражения в списке альтернатив разделяются Таким образом, Первое выражение включает в себя все от последнего разделителя шаблона ( Звучит сложно, поэтому обычной практикой является заключение списка альтернатив в скобки, чтобы минимизировать путаницу относительно того, где он начинается и заканчивается. Выражения в списке альтернатив пробуются слева направо, принимается первое же совпадение. Например, регулярное выражение Также помните, что
Группы (подвыражения)Скобки Примечание TRegExpr Позиция, длина и фактические значения подвыражений будут в MatchPos, MatchLen и Match. Вы можете заменить их с помощью функции Substitute. Подвыражения нумеруются слева направо по открывающим их скобкам (включая вложенные группы (подвыражения). У первой группы номер 1. У выражения в целом — 0.
Ссылки на группы (Backreferences)Метасимволы от
Именованные группы (подвыражения) и ссылки на нихЧтобы присвоить имя группе используйте Имя группы должно начинаться с буквы или Чтобы сослаться на именованную группу используйте
МодификаторыМодификаторы предназначены для изменения поведения регулярных выражений. и Смотрите также Разделители строк. s, одиночные строкиОбрабатывать строку как одну строку. Так что Смотрите также Разделители строк, которые обычно не совпадают. г, жадностьПримечание Специфичный для TRegExpr модификатор. Отключив его Итак, если модификатор По умолчанию этот модификатор имеет значение x, расширенный синтаксисПозволяет комментировать регулярные выражения и разбивать их на несколько строк. Если модификатор включен, мы игнорируем все пробелы, которые не заэскейплены обратной косой чертой, и не включены в класс символов. Также символ Обратите внимание, что вы можете использовать пустые строки для форматирования регулярного выражения для лучшей читаемости: ( (abc) # комментарий 1 # (efg) # комментарий 2 ) Это также означает, что если вам нужно вставить пробел или символ г, русские диапазоныПримечание Специфичный для TRegExpr модификатор. В русской таблице ASCII символы Большие и маленькие русские символы находятся в отдельных диапазонах, это не отличается от ситуации с английскими символами, но, тем не менее, я хотел иметь краткую форму. С этим модификатором вместо Когда модификатор включен:
Модификатор по умолчанию установлен на Проверки или заглядывания вперед и назад (Assertions)Заглядывание вперед (lookahead assertion) Отрицательное заглядывание вперед (negative lookahead assertion): Ретроспективная проверка (lookbehind assertion): Отрицательное заглядывание вперед (negative lookahead assertion): Ограничения:
Не захватываемые группы (подвыражения)Синтаксис: У этих групп (подвыражений) нет номера, их нельзя указать в ссылке на группу. Эти группы используют чтобы за счет группировки сделать регулярное выражение более читаемым, но нет необходимости расходовать ресурсы на то, чтобы реально отдельно захватывать то, с чем такие группы совпадут:
Атомарные группыСинтаксис: Атомарные группы это специальный случай незахватывающих групп. Подробнее МодификаторыСинтаксис для одного модификатора: Можно использовать внутри регулярного выражения. Это может быть особенно удобно, поскольку оно имеет локальную область видимости. Оно влияет только на ту часть регулярного выражения, которая следует за оператором И если оно находится внутри подвыражения, оно будет влиять только на это подвыражение, а именно на ту часть подвыражения, которая следует за оператором. Таким образом, в
РекурсияСинтаксис Выражение Основное назначение рекурсии — сбалансировать обрамление вложенного текста. Общий вид Если же обрамляемый текст также может встречаться без обрамления то выражение будет Вызовы подвыраженийНумерованные группы (подвыражения) обозначают Синтаксис для именованных групп : Это похоже на рекурсию, но повторяет только указанную группу (подвыражение). Unicode категории (category)В стандарте Unicode есть именованные категории символов (Unicode category). Категория обозначается одной буквой, и еще одна добавляется, чтобы указать подкатегорию. Например «L» это буква в любом регистре, «Lu» — буквы в верхнем регистре, «Ll» — в нижнем.
Метасимвол Метасимвол Эти метасимволы также поддерживаются внутри пользовательских классов. Элементы языка регулярных выражений — краткий справочник
В этой статье
Регулярное выражение – это шаблон, который обработчик регулярных выражений пытается сопоставить с введенным текстом. Шаблон состоит из односимвольных или многосимвольных литералов, операторов или конструкций. См. краткое описание регулярных выражений .NET. В каждом разделе этого краткого справочника приводится перечень конкретной категории символов, операторов и конструкций, которые можно использовать для задания регулярных выражений. Мы также представили эту информацию в двух форматах, чтобы вы могли ее скачать и распечатать для справки: Escape-знакиОбратная косая черта (\) в регулярных выражениях указывает, что следующий за ней символ либо является специальным знаком (как показано в следующей таблице), либо должен интерпретироваться буквально. Дополнительные сведения см. в разделе Escape-символы.
Классы символовКласс символов соответствует какому-либо одному набору символов. Классы символов состоят из языковых элементов, приведенных в следующей таблице. Дополнительные сведения см. в разделе Классы символов.
Конструкции группированияКонструкции группирования отображают части выражений регулярных выражений и обычно захватывают части строки входной строки. Конструкции группирования состоят из языковых элементов, приведенных в следующей таблице. Для получения дополнительной информации см. Конструкции группирования.
КвантификаторыКвантор указывает количество вхождений предшествующего элемента (знака, группы или класса знаков), которое должно присутствовать во входной строке, чтобы было зафиксировано соответствие. Кванторы состоят из языковых элементов, приведенных в следующей таблице. Для получения дополнительной информации см. Квантификаторы.
Конструкции обратных ссылокОбратная ссылка позволяет впоследствии идентифицировать ранее найденную соответствующую часть выражения в том же регулярном выражении. В следующей таблице перечислены конструкции обратных ссылок, поддерживаемые регулярными выражениями .NET. Для получения дополнительной информации см. Конструкции обратных ссылок.
Конструкции чередованияКонструкции изменения модифицируют регулярное выражение, включая сопоставление по принципу «либо-либо». Такие конструкции состоят из языковых элементов, приведенных в следующей таблице. Дополнительные сведения см. в разделе Конструкции чередования.
ПодстановкиПодстановки — это языковые элементы регулярных выражений, которые поддерживаются в шаблонах замены. Для получения дополнительной информации см. Подстановки. Приведенные в следующей таблице метасимволы являются атомарными утверждениями нулевой ширины.
Параметры регулярных выраженийМожно определить параметры, управляющие интерпретацией шаблона регулярного выражения обработчиком регулярных выражений. Многие из этих параметров можно указать в шаблоне регулярного выражения либо в виде одной или нескольких констант RegexOptions. Этот краткий справочник перечисляет только встраиваемые параметры. Дополнительные сведения о встроенных параметрах и параметрах RegexOptions см. в статье Параметры регулярных выражений. Встроенный параметр можно задать двумя способами:
Механизм регулярных выражений .NET поддерживает следующие встроенные параметры:
Прочие конструкцииПрочие конструкции либо изменяют шаблон регулярных выражений, либо предоставляют сведения о нем. В следующей таблице перечислены все прочие конструкции, поддерживаемые .NET. Для получения дополнительной информации см. Прочие конструкции.
См.Привет пока$ точное совпадение (начинается и заканчивается как Привет пока)воробушки соответствует любой строке, в которой есть текст воробушки Квантификаторы — * + ? и {} 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 соответствует одному символу, который не является цифрой -> тест Некоторые символы, например Шпаргалка по регулярным выражениям — Exlab
Шпаргалка представляет собой общее руководство по шаблонам регулярных выражений без учета специфики какого-либо языка. Она представлена в виде таблицы, помещающейся на одном печатном листе формата A4. Создана под лицензией Creative Commons на базе шпаргалки, автором которой является Dave Child (подробнее).
Помните, что различные языки программирования поддерживают регулярные выражения в разной степени, поэтому вы можете столкнуться с ситуацией, когда некоторые из указанных возможностей не будут работать. Для тех же, кто только знакомится с регулярными выражениями, предлагается этот перевод авторских комментариев к шпаргалке. Он познакомит вас с некоторыми техниками, применяемыми при построении шаблонов регулярных выражений. обозначает начало строки. Без него шаблон соответствовал бы любой строке, содержащей цифру.
Символьные классы
Символьные классы в регулярных выражениях соответствуют сразу некоторому набору символов. Например,
POSIX
POSIX — это относительно новое дополнение семейства регулярных выражений. Идея, как и в случае с символьными классами, заключается в использовании сокращений, представляющих некоторую группу символов.
Утверждения
Поначалу практически у всех возникают трудности с пониманием утверждений, однако познакомившись с ними ближе, вы будете использовать их довольно часто. Утверждения предоставляют способ сказать: «я хочу найти в этом документе каждое слово, включающее букву “q”, за которой не следует “werty”».\s]*).
Образцы шаблонов
В этой группе представлены образцы шаблонов. С их помощью вы можете увидеть, как можно использовать регулярные выражения в ежедневной практике. Однако заметьте, что они не обязательно будут работать в любом языке программирования, поскольку каждый из них обладает индивидуальными особенностями и различным уровнем поддержки регулярных выражений.
Кванторы
Кванторы позволяют определить часть шаблона, которая должна повторяться несколько раз подряд. Например, если вы хотите выяснить, содержит ли документ строку из от 10 до 20 (включительно) букв «a», то можно использовать этот шаблон:
По умолчанию кванторы — «жадные». Поэтому квантор
Этот шаблон соответствует тексту, заключенному в двойные кавычки. Однако, ваша исходная строка может быть вроде этой:
Приведенный выше шаблон найдет в этой строке вот такую подстроку:
Он оказался слишком жадным, захватив наибольший кусок текста, который смог.
Этот шаблон также соответствует любым символам, заключенным в двойные кавычки. Но ленивая версия (обратите внимание на модификатор
Специальные символы
Регулярные выражения используют некоторые символы для обозначения различных частей шаблона. Однако, возникает проблема, если вам нужно найти один из таких символов в строке, как обычный символ. Точка, к примеру, в регулярном выражении обозначает «любой символ, кроме переноса строки». Если вам нужно найти точку в строке, вы не можете просто использовать «
Знак экранирования, предшествующий символу вроде точки, заставляет парсер игнорировать его функцию и считать обычным символом. Есть несколько символов, требующих такого экранирования в большинстве шаблонов и языков. Вы можете найти их в правом нижнем углу шпаргалки («Мета-символы»).
Шаблон для нахождения точки таков:
Другие специальные символы в регулярных выражениях соответствуют необычным элементам в тексте. Переносы строки и табуляции, к примеру, могут быть набраны с клавиатуры, но вероятно собьют с толку языки программирования. Знак экранирования используется здесь для того, чтобы сообщить парсеру о необходимости считать следующий символ специальным, а не обычной буквой или цифрой.
Подстановка строк
Подстановка строк подробно описана в следующем параграфе «Группы и диапазоны», однако здесь следует упомянуть о существовании «пассивных» групп. Это группы, игнорируемые при подстановке, что очень полезно, если вы хотите использовать в шаблоне условие «или», но не хотите, чтобы эта группа принимала участие в подстановке.
Группы и диапазоны
Группы и диапазоны очень-очень полезны. Вероятно, проще будет начать с диапазонов. Они позволяют указать набор подходящих символов. Например, чтобы проверить, содержит ли строка шестнадцатеричные цифры (от 0 до 9 и от A до F), следует использовать такой диапазон:
Чтобы проверить обратное, используйте отрицательный диапазон, который в нашем случае подходит под любой символ, кроме цифр от 0 до 9 и букв от A до F:
Группы наиболее часто применяются, когда в шаблоне необходимо условие «или»; когда нужно сослаться на часть шаблона из другой его части; а также при подстановке строк.
Использовать «или» очень просто: следующий шаблон ищет «ab» или «bc»:
Если в регулярном выражении необходимо сослаться на какую-то из предшествующих групп, следует использовать
Первая часть шаблона ищет «aaa» или «bbb», объединяя найденные буквы в группу. За этим следует поиск одной или более цифр ( Он найдет любые вхождения слова «wish» вместе с предыдущим и следующим символами, если только это не буквы или цифры. Тогда ваша подстановка может быть такой:
Ею будет заменена вся найденная по шаблону строка. Мы начинаем замену с первого найденного символа (который не буква и не цифра), отмечая его
Модификаторы шаблонов
Модификаторы шаблонов используются в нескольких языках, в частности, в Perl. Они позволяют изменить работу парсера. Например, модификатор
Регулярные выражения в Perl обрамляются одним и тем же символом в начале и в конце. Это может быть любой символ (чаще используется «/»), и выглядит все таким образом:
Модификаторы добавляются в конец этой строки, вот так:
Мета-символы
Наконец, последняя часть таблицы содержит мета-символы. Это символы, имеющие специальное значение в регулярных выражениях. Так что если вы хотите использовать один из них как обычный символ, то его необходимо экранировать. Для проверки наличия скобки в тексте, используется такой шаблон:
Рекомендуем также:
Глава 16. Регулярные выраженияПри поиске и создании правил сегментации используются регулярные выражения, поддерживаемые платформой Java. Более подробную ПримечаниеЭтот раздел предназначен для опытных пользователей, которым требуется создавать собственные правила сегментации или использовать Таблица 16.1. Регулярные выражения — Модификаторы
Таблица 16.2. Регулярные выражения — Символы
Таблица 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.
Таблица 16.8. Регулярные выражения — Жадные кванторы
Выражение | … соответствует |
---|---|
X? | X, один раз или ни разу |
X* | X, ноль или более раз |
X+ | X, один или более раз |
Примечание
жадные кванторы будут искать как можно больше совпадений. Например, a+ для последовательности aaabbb выдаст «ааа».
Таблица 16.9. Регулярные выражения — Ленивые кванторы
Выражение | … соответствует |
---|---|
X?? | X, один раз или ни разу |
X*? | X, ноль или более раз |
X+? | X, один или более раз |
Примечание
ленивые кванторы будут искать как можно меньше совпадений. Например, a+? для последовательности aaabbb выдаст только a.
Таблица 16.10. Регулярные выражения — Логические операторы
Выражение | … соответствует |
---|---|
XY | X, за которым идёт 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 , а сама подпрограмма занимает место многоточия….Например, (? :(?
Как только подпрограмма определена, вы вызываете ее с помощью \ g
Как работает трюк?
Прежде чем мы рассмотрим полный пример, давайте обсудим, как это работает. Внешние скобки в (? :(?
Внутри группы без захвата мы начинаем со стандартного определения именованной группы (?
Механизм не знает, что на данном этапе мы стремимся только определить подпрограмму без фактического сопоставления символов.Следовательно, если он находит символы, соответствующие шаблону в названной группе, он сопоставляет их. Мы не хотим этого, поскольку наша цель в наших определениях состоит в том, чтобы просто определить, не перемещая нашу позицию в строке.
Вот почему после определения именованной группы и подпрограммы мы заставляем не захватывающую группу выйти из строя, используя (?!), Который мы видели ранее на странице с уловкой принудительного отказа. Конечно, мы не хотим, чтобы все регулярное выражение завершилось сбоем, поэтому мы используем квантификатор?, Чтобы сделать группу без захвата необязательной.
Полный пример
Этот пример идентичен приведенному в разделе о предопределенных подпрограммах: он определяет базовую грамматику, позволяя нам сопоставлять предложения, такие как пять синих слонов решают множество интересных задач и многие большие задачи напоминают некоторые интересные автомобили
Это для рубинов :
(? x) # режим пробелов ####### ОПРЕДЕЛЕНИЯ ######### # предварительное определение подпрограммы количественного анализа (? :(?многие | некоторые | пять) (?!))? # предопределить подпрограмму adj (? :(? синий | большой | интересный) (?!))? # предопределить объектную подпрограмму (? :(? <объект> автомобили | слоны | проблемы) (?!))? # предварительно определить подпрограмму noun_phrase (? :(? \ 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 | Соответствует управляющему символу 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. Чтобы соответствовать буквальному символу точки (. Или | а.е. | «пр.» в «неф» |
\ p { название } | Соответствует любому одиночному символу в общей категории Unicode или именованному блоку, заданному name . | \ p {Lu} | «C» , «L» в «City Lights» |
\ P { название } | Соответствует любому одиночному символу, который не входит в общую категорию Unicode или именованный блок, указанный в name . | \ P {Lu} | «i» , «t» , «y» в «Город» |
\ 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 - | Определяет определение балансирующей группы.((1-3) * (3-1)) « | ||
(?: подвыражение ) | Определяет группу без захвата. | Запись (?: Строка)? | «WriteLine» в «Console.WriteLine ()» |
(? 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 (? | "кошки" , "собаки" , "и" в "кошки, собаки и некоторые мыши." ———————————— « кошки » , « собаки » в « кошки, собаки и некоторые мыши ». |
(?> подвыражение ) | Атомная группа. | (?> A | ab) c | "ac" дюйм "ac" ничего дюйм |
Краткий обзор
Когда обработчик регулярных выражений встречает поисковое выражение , он берет подстроку, идущую от текущей позиции до начала (поиск назад) или конца (вперед) исходной строки, а затем запускается
Регулярное выражение.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" |
*? | Соответствует предыдущему элементу ноль или более раз, но как можно меньшее количество раз. | \ 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" |
Конструкции обратных ссылок
Обратная ссылка позволяет впоследствии идентифицировать ранее сопоставленное подвыражение в том же регулярном выражении. В следующей таблице перечислены конструкции обратной ссылки, поддерживаемые регулярными выражениями в .NET. Для получения дополнительной информации см. Конструкции обратных ссылок.
Конструкция обратной ссылки | Описание | Узор | совпадений |
---|---|---|---|
\ номер | Обратная ссылка. Соответствует значению пронумерованной части выражения. | (\ ш) \ 1 | "ее" в "искать" |
\ 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 (? | $ {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
соответствует символам, отличным от слов
.