Oracle и регулярные выражения

Как уже говорилось, регулярные выражения предназначены для нахождения соответствия в символьных строках. Другое и возможно немного более ясное определение утверждает, что регулярные выражения являются шаблонами, с которыми сравниваются строки символов на предмет совпадения или соответствия строки символов шаблону. Самый близкий пример или сравнение, которое я могу дать, - это пример, использующий сравнение LIKE, которое предлагает некоторые формы соответствия шаблону или образцу. Например, если мы хотим найти строку символов, содержащую 'Deborah', то могли бы написать следующий SQL-запрос.
SELECT text FROM my_text WHERE text LIKE '%Deborah%';
Этот запрос действительно возвратит всякую строку, которая содержит 'Deborah' в любом месте текста в пределах строки символов. Чтобы сделать быстро аналогичное сравнение с помощью регулярного выражения, можно выполнить следующий SQL-запрос, который содержит новую функцию REGEXP_LIKE.
SELECT text FROM my_text WHERE REGEXP_LIKE (text, '\Deborah\');
Итак, зачем мы хотим использовать регулярные выражения вместо того, чтобы просто использовать сравнение LIKE, с которым мы очень хорошо знакомы? Главным образом, потому, что как только Вы начинаете задавать высокоуровневые вопросы о "сходстве" строки образцу, то, наиболее вероятно, закончите условием WHERE c многократными сравнениями 'OR' и 'LIKE', чтобы вытащить то, что Вы действительно ищете. С помощью регулярных выражений Вы можете в большинстве случаев написать только один образец сравнения. Возьмем предыдущий пример. Предположим теперь, что нам требуется найти в романе главный персонаж Deborah, которую также называют 'Debbie'. В этом случае мы можем изменить наше условие для поиска текста на LIKE '%Deb%', и тем самым решить проблему. Но что случится, в этом конкретном романе обсуждаются также финансовое состояние нашей девушки из высшего общества. Мы можем прекратить поиск, найдя предложения, которые содержат слова типа 'Debt', или 'Debutante'. Мы теперь имеем очень сложную проблему. Чтобы гарантировать, что мы найдем текст, имеющий непосредственное отношение к Деборе, мы должны использовать регулярное выражение. Вот SQL-запрос, который Вы должны выполнить. Теперь он находит все предложения, где в романе говорится о Деборе.
SELECT text FROM my_text WHERE REGEXP_LIKE (text, '\Deb(bie|orah)\');
Видно, что в пределах образца соответствия мы программируем варианты текста, содержащего 'Debbie' или альтернативу 'Deborah', с помощью опции (bie|orah) в выражении. Это - каноническая форма построения шаблона, по которому выполняется сравнение строки.

Другой сложный пример, с которым вы можете справиться только используя выражения, находит адреса электронной почты. Это можно быстро сделать с помощью следующего выражения. При этом Вы строите части адреса электронной почты перед знаком '@' и после него. Посмотрите внимательно на этот образец, поскольку он требует трех разных частей адреса электронного адреса и учитывает присутствие '.', а так же как нижнего подчеркивания '_' в имени. Все эти символы вполне допустимы.
SELECT text FROM my_text
WHERE REGEXP_LIKE (text, '[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}');
Теперь, если Вы хотите искать только '.com' адреса электронной почты, то можно изменить SQL-код на следующий.
SELECT text FROM my_text WHERE REGEXP_LIKE (text, '[A-Z0-9._%-]+@[A-Z0-9._%-]+\.com');
Другая часто вызывающая затруднения проблема - это выяснение того, имеется ли число в строке текста или проверка того, представляет ли собой число строка символов. Для нахождения строки, содержащей число, которое соответствует образцу с десятичной точкой, Вы могли бы использовать этот метод. Имея в виду, что числа, которые имеют десятичную точку, должны иметь действительное число после десятичной точки, я написал '+', чтобы указать одно или более чисел.
SELECT text FROM my_text WHERE REGEXP_LIKE (text, '[0-9]?\.[0-9]+');
Регулярные выражения являются мощным орудием, когда ищутся образцы текстов или проверяется соответствие определенному образцу, подобное телефонному номеру, адресу электронной почты, IP-адресу или почти любому образцу, который нуждается в проверке. Обратным вариантом является проверка недопустимых форматов и образцов символов. В нашем предыдущем примере мы могли бы легко разыскать текст, где 'Debbie' написано с ошибкой, например, как 'Debbbie' или 'Debie'.

Другая часто вызывающая затруднения проблема - это выяснение того, имеется ли число в строке текста или проверка того, представляет ли собой число строка символов. Для нахождения строки, содержащей число, которое соответствует образцу с десятичной точкой, Вы могли бы использовать этот метод. Имея в виду, что числа, которые имеют десятичную точку, должны иметь действительное число после десятичной точки, я написал '+', чтобы указать одно или более чисел.
SELECT text FROM my_text WHERE REGEXP_LIKE (text, '(Debbbie)');
Чтобы получить имена, набранные тяжелыми пальцами, где 'b', возможно, был набит более 3-х раз; мы можем использовать следующий запрос
SELECT text FROM my_text WHERE REGEXP_LIKE (text, '(Deb)(b){2,}');
Регулярные выражения поначалу могут показаться очень замысловатыми. Мне даже требуются некоторые усилия, чтобы вспомнить эти образцы, если я не использовал их какое-то время. Но после некоторых затрат времени на изучение их построения Вы будете вознаграждены, столкнувшись со сложными критериями поиска.

Итак, где же узнать, как строить регулярные выражения. Это действительно не столь трудно, как Вы могли бы подумать. Регулярные выражения всегда сопутствовали миру Unix, и поэтому есть много информации по ним в сети. Руководства Oracle включают несколько страниц, около 5, которые посвящены регулярным выражениям; поэтому лучше начать отсюда, а в особо тяжелых случаям обращаться к сети. Вы можете смело довериться Yahoo, Google или любой другой вашей любимой поисковой машине в поиске руководств и вебсайтов, посвященным исключительно регулярным выражениям.