Регулярные выражения как сделать или

Добавил пользователь Владимир З.
Обновлено: 05.10.2024

В шпаргалке описываются регулярные выражения, работающие с библиотекой PCRE.

Метасимволы

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

Позиционные:

Группирующие:

Пробельные:

  • \f — конец страницы;
  • \n — новая строка;
  • \r — возврат каретки;
  • \t — табуляция;
  • \v — вертикальная табуляция.

Квантификаторы (для поиска последовательностей):

  • — точное количество вхождений;
  • — диапазон вхождений от min до max ;
  • ? — ноль или одно вхождение (эквивалентно );
  • + — одно или более одно вхождения (эквивалентно );
  • * — ноль, одно или более одно вхождения (эквивалентно ).

Объединяющие (для символьных классов):

  • [ — открывает символьный класс;
  • ] — закрывает символьный класс;
  • - — задает диапазон символов в символьном классе ( 5 );
  • ^ — если ^ располагается в самом начале, то это означает отрицание всех символов, входящих в состав данного символьного класса ( /[^0-9]/ ), на другой позиции трактуется как литерал;
  • \d — целое число ( 4 );
  • \D — любой символ кроме целочисленного ( [^0-9] );
  • \s — любой пробельный символ ( [\f\n\r\t\v ] );
  • \S — любой символ кроме пробельного ( [^\f\n\r\t\v ] );
  • \w — целое число, буква и подчеркивание ( [a-zA-Z0-9_] );
  • \W — любой символ кроме целого числа, буквы и подчеркивания ( [^a-zA-Z0-9_] ).

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

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

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

Группы (подмаски)

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

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

Подмаска дает возможность применять условия типа if и if-else :

  • (?(шаблон-условие)шаблон-если-успех) ;
  • (?(шаблон-условие)шаблон-если-успех|шаблон-если-провал) .

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

Модификаторы (флаги)

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

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

Escape-знаки

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

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

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

Привязки

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

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

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

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

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

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

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

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

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

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

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

Подстановки

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

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

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

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

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

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

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

Изучаем регулярные выражения

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

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

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

  • Регулярные выражения это способы описания регулярного языка.
  • Регулярный язык это формальный язык, который может быть описан конечным автоматом.

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

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

Аналогичный подход можно применять к цифрам: \d.

Пример 1

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

Для поиска соответствий наш бот будет использовать шаблон /Джош/.

Это возможно. Но для начала нам нужно кое-что изучить. Начнем с квантификаторов.

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

Регулярные выражения помогут найти иголку в стогу сена.

Квантификаторы (указатели количества вхождений символов)

0 или много

1 или много

Шаблоны (специальные символы)

С помощью шаблонов!

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

Группировка символов

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

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

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

Для этого обычно вам нужно будет использовать что-то вроде \1 – это соответствует первой определенной группе.

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

Поиск совпадений

Пример 2

Ффухх! Давайте теперь продолжим нашу историю с чат-ботом и используем то, чему мы научились, чтобы определить, кто вспоминает Джоша.

В этом выражении мы видим:

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

Обратите внимание: мы использовали .group(1) так же, как ранее использовали \1 в шаблоне регулярного выражения. Здесь нет ничего нового за исключением того, что это использование regex именно в Python.

Начало и конец

Аналогично, $ может использоваться для обозначения конца строки.

Перечисление символов

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

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

Модификаторы (флаги)

До сих пор мы говорили о шаблоне внутри /слэшей/, верно? Но что располагается за их пределами?

Слева – ничего интересного. А вот справа может быть кое-что очень полезное. Просто позор, что до сих пор мы это игнорировали!

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

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

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

Что дальше?

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

В регулярных выражениях используется множество символов / токенов. Скорее всего вы будете натыкаться на них на Stack Overflow. Иногда их значение можно угадать, исходя из своего предыдущего опыта (например, \n это символ новой строки). Но в любом случае, остается еще много для изучения.

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

А если все написанное здесь для вас легкотня, обратите внимание на regex-кроссворды. Уж они заставят вас мыслить регулярными выражениями!

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

Остается научиться всем этим пользоваться. Значительную часть описанных ниже примеров можно проверить в том же Notepad++ или Microsoft Word. Для других (связанных с программированием) — можно использовать сервис regex101, он удобен не только для обучения, но и для реальной разработки.

Содержание:

1 Теоретический раздел

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

1.1 Одиночные символы

Если символ "^" стоит вне квадратных скобок — то он задает начало строки (до сих пор поиск осуществлялся во всем тексте). Символ "$" соответствует концу строки.

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

ВыражениеСимвол
"\d" цифра
"\D" все кроме цифры "[^0-9]"
"\s" пробельный символ (табуляции, пробелы)
"\S" все, кроме пробельных символов
"\w" буква (любой язык, в любом регистре)
"\W" все кроме букв
"\b" граница слова
"\B" не граница слова

Такие обозначения могут использоваться в качестве элементов перечисления, например "[\d\w]" соответствует букве или цифре.

1.2 Квантификация

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

ВыражениеКоличество повторений
"*" 0 или более раз
"+" 1 или более раз
"?" 0 или 1 раз
"" точно n раз
"" от n до m раз


С помощью кванторов мы можем описать, например строку, содержащую номер банковской карты:

Под такое описание подойдут, например, строки "1234-1234-1234-1234" и "12345678 12345678" .

1.3 группировка (подвыражения)


Теперь будут получены только две строки — Lua и Lisp, а второе подвыражение "(.*)" будет сопоставлено с типами соответствующих языков.

Негативное заглядывания вперед ищет несоответствие строки шаблону "(?!pattern)" . Такое выражение выбирает подстроки, не соответствующие "pattern" без запоминания подстроки и не смещая текущую позицию поиска. Так, для рассмотренного выше примера, такой тип заглядывания вернет единственную строку с языком Logo. Первое подвыражение выберет строки с языками Basic, Prolog, С++ и Logo, а второе — оставит из них только те, чьи названия начинаются с символа "L" .

1.4 Что есть еще?

Наряду с заглядыванием вперед, в некоторых реализациях поддерживается позитивное и негативное заглядывания назад — "(? и "(? , соответственно. Полезно знать, что нечто подобное существует, чтобы в случае чего — найти в справочнике и применить.

Описанное выше должно одинаково работать в любой среде, поддерживающей регулярные выражения, однако в отдельных реализациях доступно больше возможностей или синтаксис выражений может незначительно отличаться. С помощью регулярных выражений можно искать строки в тексте, однако в каком регистре выполняется поиск? — ответ зависит от реализации. Управлять регистром можно с помощью модификаторов : "(?i)" включает чувствительность к регистру, а "(?-i)" — выключает ее. Существуют и другие модификаторы, но они используются реже. Работа модификаторов зависит от реализации. Некоторые реализации поддерживают также флаги, которыми также можно управлять регистром.

2 Практический раздел. Ссылки

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


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


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

  • для валидации вводимых в поля данных: QValidator примеры использования. Ряд библиотек построения графического пользовательского интерфейса позволяют закреплять к полям ввода валидаторы, которые не позволяет ввести в формы некорректные данные. По приведенной выше ссылке можно найти валидацию номера банковской карты и номера телефона с помощью регулярных выражений библиотеки Qt. Аналогичные механизмы есть в других языках, например в Java для этого используется пакет javax.faces.validator.Validator ;
  • для парсинга сайтов: Парсер сайта на Qt, использование QRegExp. В примере с сайта-галереи выбираются и скачиваются картинки заданных категорий;
  • для валидации данных, передаваемых в формате JSON ряд библиотек позволяет задавать схему. При этом для строковых полей могут быть заданы регулярные выражения. В качестве упражнения можно попробовать составить выражение для пароля — проверить что строка содержит символы в разном регистре и цифры.

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

Читайте также: