История создания регулярных выражений берет свое начало с 1942 года. В то время Уолтер Питтс — американский логик, работавший, в основном, в области когнитивной психологии, работал с известным физиологом Уорреном МакКаллоком. Основой их работы были труды связанные с теоретическим построением нейронных сетей. Немного позже, американский математик Стивен Клини изучал события в сетях МакКаллока-Питтса и предложил способ описания таких событий при помощи языка регулярных выражений.
Работа Клини вышла в середине 50-х годов двадцатого века. Научные труды были бы забыты, но американский программист Кен Томпсон в конце 60-х годов обнаружил, что регулярные выражения можно использовать для задания шаблонов поиска строк в длинных текстах. Смысл поиска заключается в том, что регулярное выражения преобразуется в конечный автомат, который производит поиск строк, которые должны соответствовать определенным шаблонам. Для построения конечного автомата Томпсон придумал специальный алгоритм, который сейчас носит название «построение Томпсона». Таким образом Кен Томпсон смог принести в мир стандарт для задания поисковых шаблонов.
Сами по себе, регулярные выражения есть ни что иное, как текстовый шаблон, который соответствует какому-то тексту. В трудах Джеффри Фридла пишется, что: «Регулярные выражения— это мощнейший инструмент, хорошо известный программистам. Однако он может быть полезен не только программистам, но и всем людям, работающим с кодом или простым текстом». При использовании регулярных выражений человеку придется работать с литералами и метасимволами. Это два существенно различающихся по своей сущности понятия. Литералы – это обычные символы, т.е. при записи в строках регулярного выражения они интерпретируются так, как они записаны. Примером литералов в регулярных выражениях может быть любая буквенная последовательность. В свою очередь, метасимволы интерпретируются при поиске особым образом. Примером может служить символ «*», который задает последовательность любого количества литералов.
В настоящее время регулярные выражения применяются в достаточно разнообразных задачах, например:
проверка правильности введенных данных на сайте( правильно ли пользователь ввёл email или ip-адрес)
разбирать большой текст на кусочки (выбирать данные из большого лога)
делать замены по шаблону
решать задачи в SQL
Синтаксис регулярных выражений относительно прост и имеет формальный синтаксис следующего вида:
[разделитель][шаблон][разделитель][модификатор]
В роли разделителя выступает любой символ, но по традиции им выступает знак «/». Важно, чтобы шаблон начинался и заканчивался одним и тем же разделителем. В конце выражений идут модификаторы, их служба нужна, чтобы менять логику работы шаблонов.
Рассмотрим простой пример регулярного выражения вида: /Лег на руку/ugi. В данном примере:
/ - начальный символ-разделитель
Лег на руку – шаблон поиска
/ - конечный символ-разделитель
Ugi – модификаторы ( UTF-8, global, case insensitive)
Как говорилось выше, регулярные выражения могут применяться и для решения задач SQL. На практике не все специалисты применяют регулярные выражения для решения поставленных задач в SQL, тем самым усложняя себе работу. Разберем на примерах как регулярные выражения могут применяться для обработки данных. В наших примерах мы прибегнем к использованию функции regexp_matches() для сравнения значений в ячейках с шаблоном, который задается внутри функции.
В первом примере нам требуется посчитать количество гласных букв в каждой ячейке определенного столбца таблицы. Примеры подобного уровня решаются относительно простым и компактным кодом, который мы приведем ниже:
with example_table as (select * from (values (1, 'google'), (2, 'yahoo'), (3, 'bing'), (4, 'rambler'))
as map(id, source_type))
select source_type, count(1) from (
select *, regexp_matches(source_type,'([aeiou])','g') as pattern from example_table ) as t
group by source_type
Второй пример будет больше приближен к настоящей практике аналитиков и специалистов, которые в свое работе используют SQL. Во втором примере нам требуется найти все телефонные номера, в которых присутствуют два или более дефисов. Для решения этой задачи нам потребуется в первом блоке создать тестовую таблицу, а затем считать количество дефисов в каждой ячейке (ячейки, в которых отсутствует дефис, включать в финальную таблицу не будем). После этого, нам потребуется поставить значения True/False относительно условия на количество дефисов. В этом нам может помочь оператор CASE WHEN COUNT (). Код, для решения данного примера будет выглядеть следующим образом:
with example_table as (
select * from (
values
(1, '8931-123-456'),
(2, '8931123-456'),
(3, '+7812123456'),
(4, '8-931-123-42-24')
)
as map(id, source_type))
select source_type, CASE WHEN COUNT(1) >= 2 THEN 'True' ELSE 'False' END from (
select *, regexp_matches(source_type,'-','g') as pattern from example_table ) as t
GROUP BY 1
В заключении стоит добавить, что владение языком регулярных выражений пригодится не только специалистам, которые в работе используют SQL, но и людям, чья работа тесно связана с компьютерной техникой, ведь область применения регулярных выражений довольно велика. В наше время владение языком регулярных выражений станет полезно даже людям, которые только обучаются поиску информации в Интернете.
Комментарии (4)
Moskus
26.12.2022 20:59В трудах Джеффри Фридла пишется
Откуда вы все берёте эту адскую канцелярско-чиновничью косноязычную привычку писать подобное в безличной форме еще и с возвратным глаголом? Почему нельзя написать по-человечески:
В трудах Джеффри Фридла написано
или
В своих трудах, Джеффри Фридл писал
Смысл возвратных глаголов (грубо - тех, которые заканчиваются на -тся, -ться) - в том, чтобы отразить самостоятельность какого-то действия, то, что объект и субъект действия - одно и то же. Очевидно, что "труды Джеффри Фридла" не пишут сами себя.
aleksandy
27.12.2022 09:14+1В трудах Джеффри Фридла пишется
Если вы решили решить проблему с помощью регулярных выражений, то теперь у вас две проблемы.
mitzury
Регулярные выражения часто помогают сокращать код. Удобнее описать регулярными выражениями то что хочешь искать. Но работает только тогда, когда данные структурированы и однотипны.