Основные понятия

Регулярные выражения (Regular expressions, regex)

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

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

Регулярное выражение состоит из

  • обычных символов (литералов)
  • классов символов (наборов символов)
  • метасимволов
  • кванторов


Для начала давайте перейдем на один из сервисов для работы с регулярными выражениями https://regexr.com/
В текст бокс "Expression" введем несколько символов, например

We are learning Regular expressions

 

Обычный символ сопоставляется в исходном виде, т.е представляет сам себя. Если наш шаблон содержит "We are learning Regular expressions", то с этим шаблоном может совпасть только последовательность "We are learning Regular expressions", ее мы и введем в текстовое поле ("Text"). Видим, что совпадение автоматически подсвечено синим цветом.

Добавим в тестовое поле еще одну строку, которая будет содержать "символ новой строки"
We are learning Regular
expressions

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

Теперь наше регулярное выражение примет вид

We are learning Regular\nexpressions

Таким же образом, мы можем обработать табы

We are learning Regular\texpressions

We are learning Regular expressions

Чтобы выбрать правильный вариант между

java script javascript можно использовать символы начала ^ и завершения строки $

^java или script$ или \bscript\b

Класс символов является набором символов, его можно задать заключив символы этого класса в квадратные скобки []

Например класс символов

[abcd]

совпадает с каждым из символов a, b, с и d. Проверим на практике.

Попробуем задать класс символов

[Regular]

Теперь совпадений значительно больше, чем при Regular

Чтобы задать противоположный или обратный набор символов, необходимо использовать специальный символ ^

[^abcd] данный класс символов совпадает с любым кроме a, b, с и d.

Диапазон символов указывается с помощью дефиса. Например, класс символов [1-9] совпадает с цифрами от 1 до 9. Аналогом данной записи будет \d или обратный набор \D

А класс символов [a-z] буквам от a до z, при этом важен регистр [A-Z], также работает и обратный набор [^A-Z]

Если необходимо выбрать все буквенные символы (в разных регистрах), все цифры и знак подчеркивания можно использовать данное выражение:

[0-9a-zA-Z_] или его сокращенную форму \w

Метасимволом служит знак точки . он означает совпадение с любым символом. Например, нам необходимо найти все записи, которые содержат 10

USD10
EUR12
BYN10
10
1.11
RUB10
UAH10

при этом валюта нас не интересует. Используем метасимвол, и сколько может быть таких символов в формате {min, limit}

.{0,3}10

 Если же нам необходимо обработать символ точки, чтобы найти 1.11, тогда точку просто экранируют \ и выражение примет вид:

1\.11

ИЛИ (альтернатива) позволяет реализовать логику, указать какие именно варианты подходят |

(USD|EUR|UAH)10

 

Квантор определяет сколько раз совпадает выражение

? обозначает совпадение 0 или 1 раз

* обозначает совпадение >=0 раз

+ обозначает совпадение >=1 раз

Проверяем шаблон

w+

 он совпадает с последовательностью символов w любой длины

w

ww

www

wwwwwwwwwwwww

 

Усложним задачу, используем фразу extend list to an end и регулярное выражение с метасимволом и квантором

e.+d

 

Замечаем интересные особенности работы регулярного выражения:

обнаружено только одно совпадение и это самая длинная последовательность (начинается с e и заканчивается символом d), хотя казалось, что будет обнаружено 2 совпадения "extend" и "end" такое поведение называется жадность, а совпадение строгим.

Можно задать и нестрогое (ленивое) совпадение, если ввести в выражение квантор ?

e.+?d

Или указать сколько раз допускается совпадение с помощью конструкции {min, limit}

(e.{0,3}d)

 

К примеру мы хотим спарсить текст ссылки (Google) из DOM

<a href="https://www.google.com>Google</a>

для этого нам понадобится регулярное выражение <.*?>

Группировка группы обозначаются круглыми скобками () и сохраняются в памяти как правило от 1 до 9.

(java|python) is my favorite language

java is my favorite language
python is my favorite language

 Чтобы отключить сохранение в память можно использовать такой вариант

(?:java|python) is my favorite language

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

(one|two)-\1 one-two one-one two-two

(1|2)=\1 для 1!=2 1=1 2=2

© 2021 QAstart.by