Регулярное выражение для чайников

Предоставлено: Нгуен Тхань Минь (разработчик Android)

  1. Зачем нам изучать регулярные выражения (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} совпадает с aaa
  • abc{4} совпадает с abcccc
  • Hel{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, aaaa
  • abc{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, @@, :D
  • a.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, abc123
  • a.*z соответствует az, abz, abcdz, aaaaaaz

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

По умолчанию квантификаторы, такие как * и +, являются «жадными», что означает, что они пытаются сопоставить как можно большую часть строки. Символ ? после квантификатора делает квантификатор «нежадным» (или «ленивым»): это означает, что он остановится, как только найдет совпадение. Например, для такой строки, как some <foo> <bar> new </bar> </foo> thing:

  • <.*> будет соответствовать <foo> <bar> new </bar> </foo>
  • <.*?> будет соответствовать <foo>

4. Побег

Обратная косая черта \ известна как escape-код, который восстанавливает исходное буквальное значение следующего символа.

Вот некоторые примеры:

  • \. соответствует буквальной точке . , а не соответствует a, b
  • \? соответствует буквальному вопросительному знаку ?

Заключение

Изученные регулярные выражения можно обобщить на изображении ниже.

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