Изучаем регулярные выражения: руководство для начинающих. Примеры регулярных выражений

Содержание

Основы

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

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

Далее, вам необходимо отключить в Regex101 флаги global и multi line. Мы рассмотрим их в следующем разделе. А пока мы сосредоточимся на простейшей форме регулярного выражения, которую мы можем создать. Введите следующее:

поле ввода регулярного выражения: cat

тестовая строка: rat bat cat sat fat cats eat tat cat mat CAT

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

Флаги регулярных выражений глобально и без учёта регистра

По умолчанию шаблон регулярного выражения возвращает только первое найденное совпадение. Если вы хотите вернуть дополнительные совпадения, вам необходимо включить флаг глобально, обозначаемый как g. Шаблоны регулярных выражений по умолчанию также чувствительны к регистру. Вы можете изменить это поведение, включив флаг без учета регистра, обозначается, как i. Обновленный шаблон регулярного выражения теперь полностью выражается, как /cat/gi. Как вы можете видеть ниже, все «кошачьи» строки были сопоставлены, включая строку в другом регистре.

Наборы символов

В предыдущем примере мы узнали, как искать точные совпадения с учетом регистра. Что, если бы мы хотели сопоставить «bat», «cat» и «fat». Мы можем сделать это, используя наборы символов, обозначенные []. По сути, вы вводите несколько символов, которые хотите сопоставить.Наборы символов также работают с цифрами.

Диапазоны

Предположим, мы хотим сопоставить все слова, которые заканчиваются на at. Мы могли бы предоставить внутри набора символов полный алфавит, но это было бы утомительно. Решение — использовать такие диапазоны [a-z]at

Вот полная строка, которая проверяется: rat bat cat sat fat cats eat tat cat dog mat CAT.

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

Частичный диапазон: варианты выбора, такие как [a-f] или [g-p].

Заглавный диапазон: [A-Z].

Диапазон цифр: [0-9].

Диапазон символов: например, [#$%&@].

Смешанный диапазон: например, [a-zA-Z0-9] включает все цифры, строчные и прописные буквы. Обратите внимание, что диапазон определяет только несколько альтернатив для одного символа в шаблоне.

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

Повторяющиеся символы

Допустим, вы хотите сопоставить все трехбуквенные слова. Вы, наверное, сделали бы это так:

JavaScript <текстареа wrap=»soft» class=»crayon-plain print-no» data-settings=»dblclick» readonly=»» style=»-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;»> [a-z][a-z][a-z]

1 [a-z][a-z][a-z]

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

a{5} будет соответствовать «ааааа».

n{3} будет соответствовать «nnn».

[a-z]{4} будет соответствовать любому слову из четырех букв, например, «door», «room» или «book».

[a-z]{6,} будет соответствовать любому слову из шести или более букв.

[a-z]{8,11} будет соответствовать любому слову от 8 до 11 букв. Таким образом можно выполнить базовую проверку пароля.

[0-9]{11} будет соответствовать 11-значному числу. Таким образом можно выполнить базовую проверку телефона.

Метасимволы

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

d соответствует любой цифре, совпадающей с [0-9]

w соответствует любой букве, цифре и символу подчеркивания

s соответствует пробельному символу, то есть пробелу или табуляции

t соответствует только символу табуляции

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

w{5} соответствует любому пятибуквенному слову или пятизначному числу

d{11} соответствует 11-значному номеру, например, номеру телефона

Начало строки: ^

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

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

  • При вызове перегрузки Matches(String, String) удается найти только первую подстроку в строке ввода, которая соответствует шаблону регулярного выражения.

  • Вызов перегрузки Matches(String, String, RegexOptions) с параметром options , имеющим значение RegexOptions.Multiline , позволяет найти все пять подстрок.

Шаблон регулярного выражения ^((w+(s?)){2,}),s(w+sw+),(sd{4}(-(d{4}|present))?,?)+ определяется, как показано в следующей таблице.

ШаблонОписание
^ Соответствие должно начинаться в начале входной строки (или в начале строки, если метод вызывается с параметром RegexOptions.Multiline ).
((w+(s?)){2,} Сопоставление одного или нескольких символов слов, за которыми следует ноль или один пробел, хотя бы два раза. Это первая группа записи. Это выражение также определяет вторую и третью группу записи: вторая состоит из записанного слова, а третья — из записанных пробелов.
,s Сопоставление запятой, за которой следует пробел.
(w+sw+) Сопоставление одного или более символов слов, за которыми следует пробел и один или более символов слов. Это четвертая группа записи.
, Сопоставление запятой.
sd{4} Сопоставление пробела, за которым следуют четыре десятичные цифры.
(-(d{4}|present))? Сопоставление нулевого или единичного вхождения дефиса, за которым следуют четыре десятичные цифры или строка present. Это шестая группа записи. Она также включает седьмую группу записи.
,? Сопоставление нулевого или единичного вхождения запятой.
(sd{4}(-(d{4}|present))?,?)+ Сопоставление одного или нескольких вхождений следующих символов: пробела, четырех десятичных цифр, нулевого или единичного вхождения дефиса, за которым следуют четыре десятичные цифры или строка present, нуля или одной запятой. Это пятая группа записи.

Конец строки: $

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

Если используется символ $ с параметром RegexOptions.Multiline , соответствие также может иметь место в конце строки. Обратите внимание, что $ соответствует n , но не соответствует rn (комбинации символов возврата и перевода строки каретки или CR/LF). Чтобы сопоставить комбинацию символов CR/LF, включите r?$ в шаблон регулярного выражения.

В следующем примере добавляется привязка $ к шаблону регулярного выражения, используемого в примере из раздела Начало строки . При использовании с исходной входной строкой, которая включает пять строк текста, методу Regex.Matches(String, String) не удается найти соответствие, потому что конец первой строки не соответствует шаблону $ . Если исходная входная строка разбивается на массив строк, методу Regex.Matches(String, String) удается найти соответствие для каждой из пяти строк. Если метод Regex.Matches(String, String, RegexOptions) вызывается с параметром options , для которого задано значение RegexOptions.Multiline, соответствия не найдены, потому что шаблон регулярного выражения не учитывает элемент возврата каретки (u+000D). Однако изменение шаблона регулярного выражения (замена $ последовательностью r?$) приведет к тому, что вызов метода Regex.Matches(String, String, RegexOptions) с параметром options , равным RegexOptions.Multiline , позволит снова найти пять соответствий.

Только начало строки: A

Привязка A указывает, что соответствие должно находиться в начале входной строки. Она идентична привязке ^ с той разницей, что A игнорирует параметр RegexOptions.Multiline . Следовательно, можно найти соответствие только для начала первой строки в многострочной входной строке.

Следующий пример похож на примеры для привязок ^ и $ . В нем привязка A используется в регулярном выражении, которое извлекает сведения о годах, в течение которых существовали некоторые профессиональные бейсбольные команды. Входная строка включает пять строк. При вызове метода Regex.Matches(String, String, RegexOptions) удается найти только первую подстроку во входной строке, которая соответствует шаблону регулярного выражения. Как показано в примере, параметр Multiline не оказывает никакого влияния.

Конец строки или до конца символа новой строки: Z

Привязка Z указывает, что соответствие должно находиться в конце входной строки или перед символом n в конце входной строки. Она идентична привязке $ с той разницей, что Z игнорирует параметр RegexOptions.Multiline . Таким образом, в многострочной строке она может соответствовать только концу последней строки или последней строке до символа n.

Обратите внимание, что Z соответствует n но не соответствует rn (комбинации символов CR/LF). Для нахождения соответствия CR/LF включите r?Z в шаблон регулярного выражения.

В следующем примере используется привязка Z в регулярном выражении, которая похожа на использованную в примере из раздела Начало строки и которая извлекает информацию о годах, в течение которых существовали некоторые профессиональные бейсбольные команды. Часть выражения r?Z в регулярном выражении ^((w+(s?)){2,}),s(w+sw+),(sd{4}(-(d{4}|present))?,?)+r?Z соответствует концу строки, а также соответствует строке, которая заканчивается на n или rn. В результате каждый элемент в массиве соответствует шаблону регулярного выражения.

Только начало строки: z

Привязка z указывает, что соответствие должно находиться в конце входной строки. Как и языковой элемент $ , z игнорирует параметр RegexOptions.Multiline . В отличие от языкового элемента Z«z не сопоставляет символ n в конце строки. Таким образом, соответствие может находиться только в последней строке входной строки.

В следующем примере используется привязка z в регулярном выражении, которая похожа на использованную в примере из предыдущего раздела с той разницей, что она извлекает информацию о годах, в течение которых существовали некоторые профессиональные бейсбольные команды. В примере предпринимается попытка сопоставить каждый из пяти элементов в массиве строк шаблону регулярного выражения ^((w+(s?)){2,}),s(w+sw+),(sd{4}(-(d{4}|present))?,?)+r?z. Две строки оканчиваются символом возврата каретки и перевода строки, одна заканчивается символом перевода строки, и еще две — ни символом возврата каретки, ни символом перевода строки. Как показывают выходные данные, шаблону соответствуют только строки без символа возврата каретки и перевода строки.

Непрерывные совпадения: G

Привязка G указывает, что соответствие должно находиться в точке окончания предыдущего соответствия. При использовании этой привязки с методом Regex.Matches или Match.NextMatch гарантируется непрерывность всех совпадений.

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

Возможные интерпретации регулярного выражения G(w+s?w*),? показаны в следующей таблице.

ШаблонОписание
G Начать сопоставление там, где закончилось последнее соответствие.
w+ Совпадение с одним или несколькими символами слова.
s? Совпадение с нулем или одним пробелом.
w* Совпадение с нулем или большим числом буквенных символов.
(w+s?w*) Сопоставление одного или более символов слов, за которыми ноль или один пробел, а затем ноль или более символов слов. Это первая группа записи.
,? Сопоставление нулевому или единичному вхождению литерального символа запятой.

Граница слова: b

Привязка b указывает, что соответствие должно находиться на границе между символом слова (языковым элементом w ) и несловесным символом (языковым элементом W ). Символы слов — это буквенно-цифровые символы и подчеркивания; несловесные символы — это все остальные символы. (См. дополнительные сведения см. о классах символов.) Соответствие может также находиться на границе слова в начале или конце строки.

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

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

ШаблонОписание
b Совпадение должно начинаться на границе слова.
are Совпадение с подстрокой are.
w* Совпадение с нулем или большим числом буквенных символов.
b Совпадение должно заканчиваться на границе слова.

Не на границе слова: B

Привязка B указывает, что соответствие не должно находиться на границе слова. Это противоположность привязки b .

В следующем примере привязка B используется для обнаружения вхождений в слове подстроки qu. Шаблон регулярного выражения Bquw+ соответствует подстроке, которая начинается с qu, которое не находится в начале слова и продолжается до конца слова.

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

ШаблонОписание
B Совпадение не должно начинаться на границе слова.
qu Совпадение с подстрокой qu.
w+ Совпадение с одним или несколькими символами слова.

Одно из нескольких подвыражений

Очень удобный метасимвол | (вертикальная черта) означает «или». Он позволяет объединить несколько регулярных выражений в одно, совпадающее с любым из выражений компонентов. Например, From и Send – два разных выражения, a (From|Send) – одно выражение, совпадающее с любой из этих строк.

Игнорирование различий в регистре

Для утилиты grep производится путём установки параметра (ключа) -i
grep -i -E `Regex` file

для PHP функций типа preg_… игнорирование различий производится модификатором i

Необязательные элементы

Метасимвол ? (знак вопроса) означает, что предшествующий ему символ является необязательным. Так же знак вопроса называют квантификатором который говорит что символ перед ним встречается 0 или 1 раз.

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

? — элемент встречается ноль или один раз.

+ — элемент встречается один или несколько раз.

* — элемент встречается ноль или несколько раз (любое количество раз).

{min, max} — элемент встречается от min до max количество раз (это интервальный квантификатор)

Круглые скобки

Круглые скобки используются в следующих случаях

  • Ограничение области действия в конструкции выбора
  • Группировка символов для применения квантификаторов
  • Обратные ссылки

Обратные ссылки

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

<([A-Za-z]+) +1> — шаблон для поиска двух повторяющихся в тексте слов.

Пары скобок нумеруются в соответствии с порядковым номером открывающей скобки слева направо, поэтому в выражении ([a-z])([0-9])12 метасимвол 1 ссылается на текст, совпавший с [a-z], a 2 ссылается на текст, совпавший с [0-9].

Экранирование

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

Пример
([a-zA-Z! ]+) — поиск слов в круглых скобках например (Hello world!)

Регулярные выражения в Java

В Java есть пакет java.util.regex, который позволяет работать с регулярными выражениями. В нем есть интерфейс MatchResult — результат операции сравнения,  классы Matcher — механизм, который выполняет операции сопоставления последовательности символов путем интерпретации шаблона и Pattern — скомпилированное представление регулярного выражения.

У класса Pattern есть метод compile(), который возвращает Pattern, соответствующий регулярному выражению. Метод matches — сравнивает выражение с набором символов и возвращает true, false в зависимости от того совпали строки или нет.

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

А как насчет проверить состоит ли строка только с цифр? С помощью вышеупомянутого метода сделать это легко.

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

Метод matches также есть и у класса String. Программа выше будет работать корректно если заменить строку Pattern.matches(«[0-9]+», string) на string.matches(«[0-9]+»). Попробуйте поэкспериментировать.

[0-9]+ и есть регулярное выражение. Оно означает, что принимаются только символы от 0 до 9, а знак + означает, что их может быть один или несколько.

Правила написания регулярных выражений

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

Их не много и они очень просты и интуитивно понятны.

  1. . — точка это соответствие любому символу
  2. ^строка — находит регулярное выражение, которое должно совпадать в начале строки
  3. строка$ — выражение, которое должно совпадать в конце строки
  4. [абв] — только буквы а или б или в
  5.  [абв][яю] — только буквы а или б или в за которыми следуют я или ю
  6. [^abc] — когда символ каретки появляется в качестве первого символа в квадратных скобках, он отрицает шаблон. Этот шаблон соответствует любому символу, кроме a или b или c.

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

  1. d — любая цифра — равнозначно [0-9]
  2. D — только не цифра — равнозначно [^0-9]
  3. s — символ пробела
  4. w — символ слова — равнозначно [a-zA-Z_0-9]

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

  1. * — символ звездочки означает от ноля до бесконечности
  2. + — символ может встречаться от одного или несколько раз, сокращенно {1,}
  3. ?  — встречается ни разу или один раз, знак вопроса это сокращение для {0,1}
  4. {X} — символ встречается X раз
  5. {X,Y} — символ встречается от X до Y раз.

Теперь очередь примеров.

примеры

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

Regex можно использовать не только с методом matches. Некоторые методы класса String принимают регулярные выражения как параметр.

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

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

0Понравилась статья? Поделиться с друзьями:Вам также может быть интересноJava для новичка 0 <хедер class=»entry-хедер»> Switch case Java: Что это такое [Примеры кода] Сегодня поговорим о switch case конструкции в языке java. Раньше мы уже пытались разобратьсяJava для новичка 3 <хедер class=»entry-хедер»> Класс Scanner в Java: Описание, методы, примеры Scanner это класс в языке Java, который позволяет считывать данные из разных

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

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

Пример: найти строку

Ниже приведен простой пример поиска шаблона java со строкой «java» во входном тексте. Он использует метод java pattern.matcher для проверки требуемого шаблона. Если образец найден, он возвращает истину, иначе он возвращает ложь.

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

Есть разные способы написания шаблонов регулярных выражений в java. Первый метод использует комбинацию классов Pattern и Matcher с методом Pattern.matcher и методом совпадений в разных операторах. Второй метод использует ту же комбинацию, но в одном операторе, а третий метод использует только Pattern.matches для поиска шаблона регулярного выражения.

В этом примере мы проверяем шаблон со вторым символом как «а», а остальные символы могут быть любыми буквами.

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

В приведенном ниже примере показаны различные демонстрации использования символа. (Точка) для регулярного выражения. 1-й выход является истинным, поскольку он соответствует входу, имеющему 2-й символ как i. Второй вывод является ложным, поскольку он не соответствует данному выражению, поскольку во втором символе нет «i». Третий вывод неверен, так как имеется более 2 символов. Последние 2 утверждения верны, поскольку 3-й символ — это «h», а последний символ — «e», соответственно, что соответствует длине символа.

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

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

Источники

  • https://webformyself.com/izuchaem-regulyarnye-vyrazheniya-rukovodstvo-dlya-nachinayushhix/
  • https://docs.microsoft.com/ru-ru/dotnet/standard/base-types/anchors-in-regular-expressions
  • https://deepark.ru/post_18_%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5+%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F.html
  • https://java-master.com/%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5-%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F-java/
  • https://www.tutorialcup.com/ru/%D0%AF%D0%B2%D0%B0/regex.htm

Как определить длину массива javascript и еще много функций работы с ними. Работа с массивами в JavaScript
Типы данных, константы и переменные в JavaScript. Типы данных в JavaScript

ITandLife.ru