📌 Больше полезных статей по информатике и программированию вы можете найти у нас на сайте.
📢 Следить за новостями мира информатики, а также общаться, делиться впечатлениями и готовиться к экзаменам лучше вместе, в нашем Telegram-канале.
Это третья статья из цикла про регулярные выражения. Здесь мы изучим работу квантификаторов и шаблонов с диапазонами символов.
Остальные доступны по ссылкам ниже:
Шаблоны с диапазонами
Рассмотренные ранее метасимволы позволяют определять любой из допустимых символов: буквы, цифры, пробельные символы и так далее. Но в синтаксисе регулярных выражений также предусмотрена возможность указывать целый диапазон символов, которые необходимо определить.
Для определения диапазона символа используются квадратные скобки. Так, например, выражение «[0-5]» позволяет определить любую цифру от 0 до 5 (0, 1, 2, 3, 4 и 5).
Представим ситуацию, когда вам необходимо найти все файлы, у которых в конце может быть несколько цифр. Например, файлы к заданию 24 могут быть пронумерованы в таком стиле: «task-24-1». То есть последнее число определяет номер файла (нумерация файлов начинается с 1), а первая часть «task-24-» – одинакова для всех.
Для того чтобы найти все файлы к 24-му заданию среди всех имён файлов, можем воспользоваться такой конструкцией:
Чтобы исключить какие-то символы из диапазона, необходимо поставить перед такими символами знак «^».
Например, в строке «A1 a2 A2 A3 A4 A5 a6 A6 A7 A8» найдём все подстроки, которые содержат только прописную букву А и любые цифры, кроме 1, 3, 5, 7:
Вы уже могли заметить, что некоторые метасимволы эквивалентны диапазонам. Такие метасимволы с диапазонами перечислены в таблице ниже.
Обратите внимание, что буквы ё и Ё не входят в диапазоны [А-Я] и [а-я]! Поэтому их надо отдельно включать, иначе регулярное выражение будет работать с ошибками.
Квадратные скобки помогают перечислить несколько вариантов одного символа. Если же необходимо перечислить слова, то тогда можно записать их через символ «|».
Например, когда необходимо найти разное написание одного слова. Тогда регулярное выражение «кеш|кэш» будет искать оба слова в строке:
Но также можно использовать символ «|» для определения нескольких вариантов одного символа, даже внутри слова. Тогда эту вариативную букву помещаем в квадратные скобки, а между различными вариантами этой буквы ставим знак «|».
Следовательно, такой код будет работать аналогично предыдущему:
Квантификаторы
Квантификаторы в регулярных выражениях – это специальные символы, которые указывают, сколько раз определённый элемент (символ, группа или класс символов) должен повторяться в рассматриваемой строке.
Квантификаторы могут быть представлены как отдельными метасимволами, так и диапазонами значений внутри фигурных скобок.
Например, если требуется найти ровно 4 повторения любой цифры, то можно использовать такой шаблон: «\d{4}». По нему в строке «1 12 123 1234 12345» будут найдены две подстроки.
Количество символов можно указывать в виде диапазона «{m, n}», что будет значить от m до n повторений предыдущего символа включительно.
Соответственно, запись «{m,}» будет означать «не менее m повторений», а запись «{,n}» — «не более n повторений». Пробел между значениями в таких диапазонах не ставится!
Квантификатор «+»
Для обозначения одного или более вхождения подстроки можно использовать символ «+», что будет аналогично записи {1,}.
Например, найдем все подстроки, состоящие хотя бы из одной буквы A:
Квантификатор «*»
Если необходимо обозначить 0 или более вхождений, то можно использовать символ «*» (аналогично {0,}).
Например, это можно использовать, когда в конце имени файла может быть очередной номер, но у самого первого, его может и не быть, хотя этот файл все равно нам нужен:
Квантификатор «?»
Бывают ситуации, когда нужно найти подстроку, которая может входить либо 0, либо 1 раз.
Например, это может произойти при работе с окончаниями у глаголов мужского и женского рода: когда в тексте нужно найти все слова «сдал» и «сдала».
Для таких случаев можно использовать символ «?».
Жадные и ленивые квантификаторы
По умолчанию все квантификаторы в регулярных выражениях являются жадными. Это означает, что они пытаются захватить как можно больше символов, соответствующих шаблону.
К примеру, шаблон «a.*b» ищет строку, которая начинается с a и заканчивается на b. Между этими символами может быть любое количество символов. Следовательно, в строке «axxxxxbaxxxb» такому шаблону будет соответствовать вся строка, так как это максимально возможное совпадение.
Но как быть, если мы не хотим захватывать всю строку целиком? Например, в предыдущей строке нам нужны подстроки «axxxxxb» и «axxxb». Для решения этой задачи нам необходимо сделать квантификатор «*» ленивым.
Ленивые квантификаторы ищут минимально возможное совпадение. Чтобы сделать квантификатор ленивым, нужно добавить знак «?» после него.
Таким образом, поставив вопросительный знак после «*» мы потребовали, чтобы регулярное выражение захватывало минимально возможное количество символов между a и b.
Из всего вышесказанного про ленивые и жадные квантификаторы можно сделать такой вывод:
- Жадные квантификаторы полезны, когда нужно захватить как можно больше данных. Например, для поиска самого длинного совпадения в тексте.
- Ленивые квантификаторы полезны, когда нужно найти минимальное совпадение. Например, для извлечения отдельных элементов (тегов, слов и т.д.).
В следующей статье мы рассмотрим работу скобочных групп, а также научимся использовать опережающие и ретроспективные проверки.