Учебники

15) Регулярные выражения

Что такое регулярные выражения?

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

 

Основной синтаксис

Основной синтаксис для регулярного выражения следующий

SELECT statements... WHERE fieldname REGEXP 'pattern';

ВОТ —

  • «Операторы SELECT …» — это стандартное утверждение SELECT
  • «WHERE fieldname» — это имя столбца, для которого должно выполняться регулярное выражение.
  • «REGEXP ‘pattern'» REGEXP — это оператор регулярного выражения, а ‘pattern’ представляет шаблон, который должен соответствовать REGEXP. RLIKE является синонимом REGEXP и достигает тех же результатов, что и REGEXP. Чтобы не путать его с оператором LIKE, лучше использовать REGEXP .

 

Давайте теперь посмотрим на практический пример

SELECT * FROM `movies` WHERE `title` REGEXP 'code';

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

Давайте предположим, что мы хотим искать фильмы, которые начинаются с a, b, c или d, за которыми следует любое количество других символов, как мы собираемся достичь этого. Мы можем использовать регулярное выражение вместе с метасимволами для достижения желаемых результатов.

SELECT * FROM `movies` WHERE `title` REGEXP '^[abcd]';

 

Выполнение вышеуказанного скрипта в MySQL Workbench против myflixdb дает нам следующие результаты.

movie_idtitledirectoryear_releasedcategory_id
4Code Name BlackEdgar Jimz2010NULL
5Daddy's Little GirlsNULL20078
6Angels and DemonsNULL20076
7Davinci CodeNULL20076

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

‘^ [abcd]’ символ вставки (^) означает, что сопоставление с образцом следует применять в начале, а список символов [abcd] означает, что в нашем наборе результатов будут возвращены только заголовки фильмов, начинающиеся с a, b, c или d.

Давайте изменим наш скрипт выше и воспользуемся списком NOT, и посмотрим, какие результаты мы получим после выполнения нашего запроса.

SELECT * FROM `movies` WHERE `title` REGEXP '^[^abcd]';

Выполнение вышеуказанного скрипта в MySQL Workbench против myflixdb дает нам следующие результаты.

movie_idtitledirectoryear_releasedcategory_id
1Pirates of the Caribean 4 Rob Marshall20111
2Forgetting Sarah MarshalNicholas Stoller20082
3X-Men 2008 
9Honey moonersJohn Schultz20058
1667% Guilty 2012 
17The Great DictatorChalie Chaplie19207
18sample movieAnonymous 8
19movie 3John Brown19208

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

‘^ [^ abcd]’ символ вставки (^) означает, что сопоставление с образцом следует применять в начале, а список символов [^ abcd] означает, что названия фильмов, начинающиеся с любого из вложенных символов, исключаются из набора результатов.

 

Метасимволы регулярных выражений

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

 

голец Описание пример  
* Звездочка (*) Метасимвол используется для сопоставления ноль (0) или более экземпляров строк , предшествующих его ВЫБЕРИТЕ * ИЗ ФИЛЬМОВ, ГДЕ название REGEXP ‘da *’; даст все фильмы, содержащие символы «да». Например, код Да Винчи, Daddy’s Little Girls.
+ Метасимвол плюс (+) используется для сопоставления одного или нескольких экземпляров строк, предшествующих ему. SELECT * FROM `movies` WHERE` title` REGEXP ‘mon +’; выдаст все фильмы, содержащие символы «мон». Например, ангелы и демоны.
? Метасимвол вопроса (?) Используется для соответствия нулю (0) или одному экземпляру строк, предшествующих ему. ВЫБЕРИТЕ * ИЗ `категорий` ГДЕ` имя_категории` REGEXP ‘com?’;  выдаст все категории, содержащие строку com. Например, комедия, романтическая комедия.
, Точка (.) Метасимвол используется для любого одиночного символа в исключении новой строки. ВЫБРАТЬ * ИЗ ФИЛЬМОВ ГДЕ `year_released` REGEXP ‘200.’; даст все фильмы, выпущенные за годы, начиная с символов «200», за которыми следует любой отдельный символ. Например, 2005, 2007, 2008 и т. д.
[ABC] Charlist [а] используются для сопоставления любых из вложенных символов. SELECT * FROM `movies` WHERE` title` REGEXP ‘[vwxyz]’; выдаст все фильмы, содержащие какой-либо один символ в «vwxyz». Например, Люди Икс, Код Да Винчи и т. д.  
[^ А] Список символов [^ abc] используется для соответствия любым символам, кроме прилагаемых. SELECT * FROM `movies` WHERE` title` REGEXP ‘^ [^ vwxyz]’; выдаст все фильмы, содержащие символы, отличные от «vwxyz».
[AZ] [AZ] используется , чтобы соответствовать любой заглавной букве. SELECT * FROM `members` WHERE` postal_address` REGEXP ‘[AZ]’; даст всем членам, которые имеют почтовый адрес, содержащий любой символ от A до Z. Например, Джанет Джонс с номером участника 1.
[AZ] [Аз] используются , чтобы соответствовать любому строчной буквы SELECT * FROM `members` WHERE` postal_address` REGEXP ‘[az]’; даст всем членам, которые имеют почтовые адреса, содержащие любой символ от а до я. . Например, Джанет Джонс с членством № 1.
[0-9] [0-9] используется для сопоставления любой цифры от 0 до 9. SELECT * FROM `members` WHERE` номер_контакта` REGEXP ‘[0-9]’   даст всем участникам отправленные контактные номера, содержащие символы «[0-9]». Например, Robert Phil.
^ Символ каретки (^) используется для начала матча в начале. SELECT * FROM `movies` WHERE` title` REGEXP ‘^ [cd]’; дает все фильмы с названием, начинающимся с любого из символов в «cd». Например, кодовое имя Black, Daddy’s Little Girls и Da Vinci Code.
| Вертикальная черта (|) используется для изолирования альтернатив. SELECT * FROM `movies` WHERE` title` REGEXP ‘^ [cd] | ^ [u]’; дает все фильмы с заголовком, начинающимся с любого из символов «cd» или «u». Например, кодовое имя «Черный», «Маленькая девочка папы», «Код да Винчи» и «Другой мир — Пробуждение».
[[: <:]] [[: <:]] Соответствует началу слов. SELECT * FROM `movies` WHERE` title` REGEXP ‘[[: <:]] для’; дает все фильмы с названиями, начиная с персонажей. Например: Забыть Сару Маршал.
[[:>:]] [[:>:]] Соответствует концу слов. SELECT * FROM `movies` WHERE` title` REGEXP ‘ack [[:>:]]’;  дает все фильмы с названиями, заканчивающимися символами «ack». Например, кодовое имя Black.
[:учебный класс:] [: Класс:] совпадает с классом символов , т.е. [: альфа:] , чтобы соответствовать письмам, [: пространство:] , чтобы соответствовать белому пространству, [пунктуатор] спичка пунктуацию и [: верхний:] для прописных букв класса. SELECT * FROM `movies` WHERE` title` REGEXP ‘[: alpha:]’; все фильмы с заголовками содержат только буквы. Например, «Забыть Сару Маршал», «Люди Икс» и т. д. Такие фильмы, как «Пираты Карибского моря 4», будут опущены в этом запросе.

 

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

Резюме

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