Добавить в корзинуПозвонить
Найти в Дзене

Регулярные выражения. Квантификаторы и диапазоны

📌 Больше полезных статей по информатике и программированию вы можете найти у нас на сайте. 📢 Следить за новостями мира информатики, а также общаться, делиться впечатлениями и готовиться к экзаменам лучше вместе, в нашем Telegram-канале. Это третья статья из цикла про регулярные выражения. Здесь мы изучим работу квантификаторов и шаблонов с диапазонами символов. Остальные доступны по ссылкам ниже: Рассмотренные ранее метасимволы позволяют определять любой из допустимых символов: буквы, цифры, пробельные символы и так далее. Но в синтаксисе регулярных выражений также предусмотрена возможность указывать целый диапазон символов, которые необходимо определить. Для определения диапазона символа используются квадратные скобки. Так, например, выражение «[0-5]» позволяет определить любую цифру от 0 до 5 (0, 1, 2, 3, 4 и 5). Представим ситуацию, когда вам необходимо найти все файлы, у которых в конце может быть несколько цифр. Например, файлы к заданию 24 могут быть пронумерованы в таком стил
Оглавление

📌 Больше полезных статей по информатике и программированию вы можете найти у нас на сайте.

📢 Следить за новостями мира информатики, а также общаться, делиться впечатлениями и готовиться к экзаменам лучше вместе, в нашем Telegram-канале.

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

Остальные доступны по ссылкам ниже:

Шаблоны с диапазонами

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

Для определения диапазона символа используются квадратные скобки. Так, например, выражение «[0-5]» позволяет определить любую цифру от 0 до 5 (0, 1, 2, 3, 4 и 5).

Представим ситуацию, когда вам необходимо найти все файлы, у которых в конце может быть несколько цифр. Например, файлы к заданию 24 могут быть пронумерованы в таком стиле: «task-24-1». То есть последнее число определяет номер файла (нумерация файлов начинается с 1), а первая часть «task-24-» – одинакова для всех.

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

-2

Чтобы исключить какие-то символы из диапазона, необходимо поставить перед такими символами знак «^».

Например, в строке «A1 a2 A2 A3 A4 A5 a6 A6 A7 A8» найдём все подстроки, которые содержат только прописную букву А и любые цифры, кроме 1, 3, 5, 7:

-3

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

-4

Обратите внимание, что буквы ё и Ё не входят в диапазоны [А-Я] и [а-я]! Поэтому их надо отдельно включать, иначе регулярное выражение будет работать с ошибками.

Квадратные скобки помогают перечислить несколько вариантов одного символа. Если же необходимо перечислить слова, то тогда можно записать их через символ «|».

Например, когда необходимо найти разное написание одного слова. Тогда регулярное выражение «кеш|кэш» будет искать оба слова в строке:

-5

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

Следовательно, такой код будет работать аналогично предыдущему:

-6

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

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

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

Например, если требуется найти ровно 4 повторения любой цифры, то можно использовать такой шаблон: «\d{4}». По нему в строке «1 12 123 1234 12345» будут найдены две подстроки.

-7

Количество символов можно указывать в виде диапазона «{m, n}», что будет значить от m до n повторений предыдущего символа включительно.

Соответственно, запись «{m,}» будет означать «не менее m повторений», а запись «{,n}»«не более n повторений». Пробел между значениями в таких диапазонах не ставится!

Квантификатор «+»

Для обозначения одного или более вхождения подстроки можно использовать символ «+», что будет аналогично записи {1,}.

Например, найдем все подстроки, состоящие хотя бы из одной буквы A:

-8

Квантификатор «*»

Если необходимо обозначить 0 или более вхождений, то можно использовать символ «*» (аналогично {0,}).

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

-9

Квантификатор «?»

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

Например, это может произойти при работе с окончаниями у глаголов мужского и женского рода: когда в тексте нужно найти все слова «сдал» и «сдала».

Для таких случаев можно использовать символ «?».

-10

Жадные и ленивые квантификаторы

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

К примеру, шаблон «a.*b» ищет строку, которая начинается с a и заканчивается на b. Между этими символами может быть любое количество символов. Следовательно, в строке «axxxxxbaxxxb» такому шаблону будет соответствовать вся строка, так как это максимально возможное совпадение.

-11

Но как быть, если мы не хотим захватывать всю строку целиком? Например, в предыдущей строке нам нужны подстроки «axxxxxb» и «axxxb». Для решения этой задачи нам необходимо сделать квантификатор «*» ленивым.

Ленивые квантификаторы ищут минимально возможное совпадение. Чтобы сделать квантификатор ленивым, нужно добавить знак «?» после него.

-12

Таким образом, поставив вопросительный знак после «*» мы потребовали, чтобы регулярное выражение захватывало минимально возможное количество символов между a и b.

Из всего вышесказанного про ленивые и жадные квантификаторы можно сделать такой вывод:

  1. Жадные квантификаторы полезны, когда нужно захватить как можно больше данных. Например, для поиска самого длинного совпадения в тексте.
  2. Ленивые квантификаторы полезны, когда нужно найти минимальное совпадение. Например, для извлечения отдельных элементов (тегов, слов и т.д.).

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

Наука
7 млн интересуются