Что это такое, специальные персонажи, о которых вам следует знать, и ресурсы, которые помогут вам их создать

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

Определение регулярных выражений

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

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

В качестве примера возьмем адреса электронной почты. Когда вы регистрируетесь на Medium.com, вы по своей природе обязаны указать адрес электронной почты и пароль. За кулисами Medium.com должен (как никогда не знать) использовать регулярное выражение для проверки правильности формата адреса электронной почты или действительного пароля. Обычно это выглядит как небольшое раздражающее сообщение, в котором говорится: «Ваш пароль не содержит одного из следующих специальных символов:?,!,.,» И т. Д. ». В качестве быстрого примера мы могли бы использовать следующее регулярное выражение для фильтрации писем в текстовой строке, заканчивающейся на «@ gmail.com»:

(@gmail. * \. com $)

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

Основы RegEx

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

r" apple
r" pear

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

  • Метасимволы
  • Особые последовательности
  • Последовательности побега
  • Классы персонажей
  • Индикаторы возникновения
  • Позиционирование якорей

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

Метасимволы

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

Metacharacter | Description
.               Finds any single character 
^               Start of string
$               End of string
*               Matches zero or more times   
+               Matches one or more times
?               Matches either 0 or 1times
{}              Matches all inside a set amount of times 
[]              Specifies a set of characters to match
\               Escapes metacharacters to match them in patterns
|               Specifies either a or b (a|b) 
()              Captures all enclosed

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

.
Regular Expression
 r” .
Test String
 word

В этом примере метасимвол «.» Будет соответствовать любому символу в тестовой строке. Следовательно, тестовая строка «слово» будет проходить во всех случаях.

^
Regular Expression
 r” ^word
Test String
 word

Метасимвол «^» соответствует началу строки без использования каких-либо символов. Это означает, что регулярное выражение проверяет наличие «слова» в начале тестовой строки. Если мы изменим тестовую строку на «aword» вместо «word», тогда тестовая строка не будет соответствовать регулярному выражению, потому что «word» не находится в начале строки.

$
Regular Expression
 r” word$
Test String
 word

В этом примере метасимвол проверяет наличие «слова» в конце тестовой строки. В отличие от вышеизложенного, если мы изменим тестовую строку на «слово», тогда тестовая строка пройдет, потому что «слово» находится в конце строки.

+
Regular Expression
 r” a+
Test String
 aa

Поскольку метасимвол «+» проверяет наличие одного или нескольких последовательных символов, тестовая строка «aa» будет проходить, поскольку регулярное выражение идентифицировало два символа «a».

?
Regular Expression
 r” ba?
Test String
 ba b a

Метасимвол «?» Проверяет наличие символа один или несколько раз. В этом контексте регулярное выражение проверяет наличие символа «ba» или более раз, а не самого символа «a». В текстовой строке «ba» передается так, как она соответствует «ba?» регулярное выражение, но «b» также пройдет, потому что регулярное выражение проверяет символ «b», за которым не следует специальный символ.

[]
Regular Expression
 r” [abc]
Test String
 aa bb ccc

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

\
Regular Expression
 r” \Ahello
Test String
 hello

Метасимвол обратной косой черты будет обсуждаться более подробно позже, но по существу указывает на особую последовательность. В этом примере «\ A» указывает начало строки, поэтому «hello» пройдет проверку.

|
Regular Expression
 r” a|b
Test String
 a hello b

Знак «|» regex указывает либо на это регулярное выражение, либо с указанием символов «a» или «b». Следовательно, тестовая строка будет соответствовать как «a», так и «b» в тестовой строке, но не будет соответствовать слову «hello» или пробелам.

{}
Regular Expression
 r” a{3}
Test String
 aaa

Метасимвол фигурной скобки определяет количество вхождений символа. В этом примере регулярное выражение ищет шаблон из 3 последовательных символов «a», который предоставляет тестовая строка.

(…)
Regular Expression
 r” (abc)
Test String
 a b abc

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

Особые последовательности

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

Special Sequences | Description
\A                  Matches character at beginning of string
\b                  Matches character at beginning or end
\B                  Matches character NOT at start or end
\w                  Matches any word character
\W                  Matches any non-word character
\d                  Matches any digit, ie. 0-9
\D                  Matches any non-digit character
\s                  Matches any whitespace character
\S                  Matches any non-whitespace character
\0                  Matches any NULL character 
\n                  Matches any new line character
\f                  Matches any form-feed character
\t                  Matches any tab character
\v                  Matches newlines and vertical tabs
\Z                  Matches specified character at end of a string

Последовательности побега

Escape-последовательности используются для сопоставления специальных символов в регулярном выражении. Это означает, что мы можем использовать специальный символ с префиксом «\». Например;

Escape Sequence | Description
\.                Matches “.”
\+                Matches “+”
\(                Matches “(“

Классы персонажей

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

Brackets   |    Description
[abc]           Finds any character within the brackets
[^abc]          Finds any character NOT within the brackets
[a-z]           Matches any characters between a and z
[^a-z]          Matches any character excpet those in range a-z
[a-\A-Z]        Matches any character in range a-z or A-Z
[0-9]           Finds a digit within the brackets
[^0-9]          Finds a digit NOT within the brackets
[(]             Matches the literal '('

Например, если вы хотите сопоставить «a» или «e», используйте [ae]. Если мы укажем мир «hello» как he [ae] llo, тогда будет совпадать либо «hallo», либо «hello». Классы символов - чрезвычайно распространенное использование регулярных выражений, и в примере электронной почты, использованном в начале этой статьи, мы могли проверить случаи, когда пользователь случайно вводит «@ gmeil.com», а не «@ gmail.com».

Индикаторы возникновения (или операторы повторения)

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

Occurrence Indicators  |  Description
+                         Matches one or more times
?                         Matches zero or one time
*                         Matches zero or more times
{n}                       Matches exactly n number of times
{n,}                      Matches at least n number of times
{n,m}                     Matches from n to m times
{,n}                      Matches up to n times

Позиционирование якорей

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

Anchors    |    Description
^               Start of string
$               End of string
\A              Start of string
\Z              End of string
\b              Matches between start/end of a word 
\B              Inverse (non-start or non-end of a word)

Жадное сопоставление или не-жадное сопоставление

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

Regular Expression
{START}.*{END}
Test String
{START} Hello world 2{END} and {START} hello world 2{END}

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

Full Match: {START} Hello world 2{END} and {START} hello world 2{END}

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

Regular Expression
{START}.*?{END}
Test String
{START} Hello world 1{END} and {START} hello world 2{END}
Match 1: {START} Hello world 1{END}
Match 2: {START} Hello world 2{END}

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

Ресурсы

Тестеры RegEx

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

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

Regexr, полезный для регулярных выражений JavaScript и PCRE, предоставляет простой пользовательский интерфейс со справочником в левой части, в то время как правая часть позволяет вам тестировать выражения. Этот редактор несколько ограничен тем, что может тестировать только JavaScript и PCRE.

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

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

Документация RegEx

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

Резюме

Обзор

  • Регулярное выражение - это текстовая строка, описывающая набор символов, которым механизм регулярных выражений пытается сопоставить.
  • Регулярные выражения позволяют нам обнаруживать, извлекать, заменять и сопоставлять строки, чтобы извлечь ключевую информацию из текста.
  • Доступны различные справочные руководства по регулярным выражениям и онлайн-редакторы, которые позволяют тестировать регулярные выражения, прежде чем включать их в свои решения.

Специальные символы:

  • Метасимволы: символы со специальным значением.
  • Специальные последовательности: обратная косая черта «\», за которой следует определенный символ.
  • Escape Sequences: используется для сопоставления специального символа в регулярном выражении.
  • Классы символов: укажите символы, которые должны совпадать, в квадратных скобках.
  • Индикаторы появления: метасимволы, соответствующие нескольким экземплярам символа.
  • Якоря позиции: соответствие позиции, обычно до, после или между символами.

Если вы нашли время прочитать эту статью, благодарим вас за это. Надеюсь, вам это пригодилось, а раздел ресурсов поможет вам в дальнейшем обучении.