
Регулярное выражение для чайников
Предоставлено: Нгуен Тхань Минь (разработчик Android)
- Зачем нам изучать регулярные выражения (Regex)?
Вы когда-нибудь участвовали в проекте с более чем 500 файлами кода и понимали, что существует множество жестко закодированных измерений? Ваша задача найти и исправить их следующим образом:
width: 40 -> width: 40.responsive() height: 50 -> height: 50.responsive() top: 60 -> top: 60.responsive() bottom: 70 -> bottom: 70.responsive() left: 40 -> left: 40.responsive() right: 30 -> right: 30.responsive() fontSize: 13 -> fontSize: 13.responsive() horizontal: 10 -> horizontal: 10.responsive() vertical: 20 -> vertical: 20.responsive()
Сколько времени нужно, чтобы это сделать? Наверняка потребуется много времени и усилий, если вам придется вручную искать и исправлять каждое место. Тем не менее, это занимает у меня всего 2 минуты. Это возможно благодаря мощной функции в IDE и текстовых редакторах, которая называется Найти и заменить по регулярному выражению.

Конечно, вам нужно знать Regex, чтобы использовать эту функцию. Вот почему вы должны изучить Regex. Это сделает вашу жизнь намного проще.
В дополнение к функции «Найти и заменить» регулярное выражение также оказывается полезным для нас во многих других сценариях, таких как:
- Проверка и анализ данных. Регулярные выражения часто используются для проверки вводимых пользователем данных, таких как адреса электронной почты, номера телефонов и пароли, на соответствие определенным шаблонам. Их также можно использовать для анализа структурированных данных из неструктурированного текста.
- Очистка веб-страниц. При извлечении информации с веб-страниц или других структурированных документов регулярные выражения могут помочь определить и зафиксировать определенные шаблоны данных.
2. Что такое регулярное выражение?
[-+.A-Za-z0-9]+@[A-Za-z0-9][A-Za-z0-9-]+(\.[A-Za-z0-9][A-Za-z0-9-]+)+
Если вы чем-то похожи на меня, вам, вероятно, интересно, на что, черт возьми, я смотрю.
«Regex», сокращение от «регулярное выражение», — это мощная последовательность символов, которая формирует шаблон поиска. Это текстовая строка, которая описывает определенный шаблон символов и используется для выполнения таких операций, как поиск, сопоставление, замена и проверка в текстовых строках. Регулярные выражения поддерживаются различными языками программирования, текстовыми редакторами и инструментами.
Регулярные выражения состоят из комбинации символов, специальных символов и метасимволов, которые определяют набор правил сопоставления с образцом. Эти шаблоны позволяют выполнять сложные манипуляции со строками с кратким и гибким синтаксисом.
Например:
0\d{9}соответствует любому 10-значному номеру телефона, начинающемуся с0, например 0905123456, 0907987654[-+.A-Za-z0–9]+@[A-Za-z0–9][A-Za-z0–9-]+(\.[A-Za-z0–9][A-Za-z0–9-]+)+соответствует адресам электронной почты, таким как [email protected], [email protected],…
Это может показаться сложным, но на самом деле научиться этому несложно. В этой серии я буду знакомить вас с метасимволами от простого к сложному, а также с множеством упражнений для практики. Эти упражнения помогут нам глубже понять Regex.
3. квантификаторы
В Regex «квантификатор» указывает, сколько раз определенный символ или группа символов должны появляться во входной строке. Квантификаторы контролируют повторение символов и помогают определить гибкость соответствия. Они позволяют указать диапазон вхождений, делая шаблоны более гибкими и способными сопоставлять тексты разной длины.
В этой статье мы рассмотрим квантификаторы, такие как {n}, {n,}, {n, m}, ?, +, *, а также самый популярный метасимвол в Regex: ..
3.1. Квантификатор: {n}
{n}: «n» — неотрицательное число. Этот квантификатор указывает, что предыдущий символ или группа должны встречаться ровно «n» раз. Он позволяет указать фиксированное количество повторений для определенного шаблона. Например:
a{3}совпадает сaaaabc{4}совпадает сabccccHel{2}oсовпадает сHello
Чтобы начать использовать и научиться использовать Regex, я часто использую сайт https://regex101.com/. Интерфейс выглядит следующим образом:

Прежде всего, вам нужно знать только три области, выделенные красным: место для ввода регулярных выражений, место для ввода тестовых случаев и область, отображающая совпадающие результаты. Две другие области, Regex Flavor и Regex Flag, будут описаны в следующей статье. На данный момент мы должны использовать Regex Flavor ECMAScript и Regex Flag gm.
Мы можем легко увидеть, что при вводе регулярного выражения a{3} с предоставленными тестовыми примерами, как показано на изображении, есть 2 совпадающих результата.
3.2. Квантификатор: {n,}
x{n,}: «n» — неотрицательное число. Этот квантификатор используется для сопоставления «n» или более вхождений предшествующего символа или группы. Он задает нижнюю границу количества раз, которое должен появляться шаблон. Например:
a{3,}соответствует строкам с тремя или более последовательными символами «а». напримерaaa,aaaaabc{4,}соответствуетabcccc,abccccc,…Hel{2,}oсоответствуетHello,Hellllllo,…
3.3. Квантификатор: {n, m}
x{n, m}: «n» и «m» — неотрицательные числа и n ≤ m. Этот квантификатор используется для сопоставления диапазона вхождений предшествующего символа или группы. Он указывает, что шаблон должен появляться не менее «n» и не более «m» раз. Он позволяет определить нижнюю и верхнюю границу количества повторений.
Например:
a{2,4}соответствует строкам, в которых 'a' повторяется от 2 до 4 раз подряд, напримерaa,aaa,aaaa.ab{3,5}соответствует строкам, в которых "a" следует за "b", повторяющимся от 3 до 5 раз подряд, например,abbb,abbbb,abbbbb.ab{3,5}cсоответствует строкам, в которых за символом «a» следует «b», повторяющийся от 3 до 5 раз подряд, а затем следует символ «c», напримерabbbc,abbbbc,abbbbbc.
3.4. Метасимвол: .
Это не квантификатор, но это самый популярный метасимвол в Regex. Символ . (точка) в регулярных выражениях соответствует любому одиночному символу, кроме символа новой строки (\n). Это подстановочный знак, который может заменить любой символ.
Вот несколько примеров, иллюстрирующих использование символа .:
.: этот шаблон соответствует любому отдельному символу, напримерa,á,b,c,1,2,3,世,€, 🌟, @, #a.b: этому шаблону соответствует любая строка, в которой есть "a", за которой следует любой символ, а затем "b", напримерaxb,a4b,a$b..{2,}соответствует двум или более любым символам (кроме символов новой строки), напримерabcd,123,@@,:Da.b.{3}c: этот шаблон соответствует любой строке, в которой есть «a», за которой следует любой символ, за которым следует «b», за которым следуют три любых символа, а затем за ними «c», напримерa1b123c,axbxyzc,a€b世~@c.
3.5. Квантификатор: ?
Символ ? указывает на то, что предыдущий символ или группа являются необязательными, то есть они могут встречаться ноль или один раз. Он используется, чтобы указать, что что-то является необязательным.
Вот несколько примеров, иллюстрирующих использование символа ?:
colou?r: этот шаблон соответствует либоcolor, либоcolour, посколькуuне является обязательным..?соответствует нулю или одному произвольному символу. Примеры:(empty),a,b,#,1.a.?zсоответствуетaz,abz,a1z,a$z
3.6. Квантификатор: +
Символ + указывает, что предыдущий символ или группа должны появиться один или несколько раз. Он используется, чтобы указать, что что-то должно быть повторено хотя бы один раз.
Вот несколько примеров, иллюстрирующих использование символа +:
a+соответствует строкам, которые содержат одно или несколько последовательных вхождений символа «a», напримерa,aa,aaaaaaa.+соответствует строкам, содержащим хотя бы один символ, напримерa,ab,abc123.a.+zсовпадает сabz,abcdz,aaaaaaz
3.7. Квантификатор: *
Символ * указывает, что предыдущий символ или группа должны встречаться ноль или более раз. Он используется для указания того, что что-то может повторяться любое количество раз, включая ноль раз.
Вот несколько примеров, иллюстрирующих использование символа *:
a*соответствует строкам, которые содержат ноль или более последовательных вхождений символа «a», например(empty),a,aa,aaaaaaa.*соответствует строкам, содержащим любую последовательность символов, включая нулевые символы, например(empty),a,abc123a.*zсоответствуетaz,abz,abcdz,aaaaaaz
3.8. Жадные/ленивые квантификаторы
По умолчанию квантификаторы, такие как * и +, являются «жадными», что означает, что они пытаются сопоставить как можно большую часть строки. Символ ? после квантификатора делает квантификатор «нежадным» (или «ленивым»): это означает, что он остановится, как только найдет совпадение. Например, для такой строки, как some <foo> <bar> new </bar> </foo> thing:
<.*>будет соответствовать<foo> <bar> new </bar> </foo><.*?>будет соответствовать<foo>
4. Побег
Обратная косая черта \ известна как escape-код, который восстанавливает исходное буквальное значение следующего символа.
Вот некоторые примеры:
\.соответствует буквальной точке., а не соответствуетa,b\?соответствует буквальному вопросительному знаку?
Заключение
Изученные регулярные выражения можно обобщить на изображении ниже.

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