Книги и статьи по SQL Rambler's Top100 Switch language to: English 16 апреля 2024 г. 23:51:14


www.sql-ex.ru
Skip Navigation Links  

 

Print  Версия для печати

На главную страницу

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

James F. Koopmann (оригинал: Oracle and Regular Expressions)
Перевод Моисеенко С.И.

Unix пришел в Oracle в форме регулярных выражений, чтобы увеличить мощь поиска.

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

Я познакомился с регулярными выражениями давным-давно, программируя на Perl или скриптовой оболочке unix с помощью команд awk и sed. Также, если Вы используете vi редактор, то можете быть знакомыми с регулярными выражениями и сравнением с образцом. Регулярные выражения в действительности представляют собой маленький язык программирования, который предназначен для поиска символьных образцов в текстовой строке. Если честно, когда я начал использовать сравнение с образцом в мои дни Perl, оно показалось мне весьма путаным. Главным образом, потому что было столь много изменений и вариантов, что я не знал, как начать. Хотя спустя некоторое время, я приобрел некоторые навыки. И Вы сможете также. Наберитесь терпения прочесть эту статью и понять, насколько мощным может быть это сравнение с образцом.

Как уже говорилось, регулярные выражения предназначены для нахождения соответствия в символьных строках. Другое и возможно немного более ясное определение утверждает, что регулярные выражения являются шаблонами, с которыми сравниваются строки символов на предмет совпадения или соответствия строки символов шаблону. Самый близкий пример или сравнение, которое я могу дать, - это пример, использующий сравнение 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 или любой другой вашей любимой поисковой машине в поиске руководств и вебсайтов, посвященным исключительно регулярным выражениям.

20-07-2007

На главную страницу

Print  Версия для печати


Использование любых материалов данного сайта возможно только
при условии обязательного размещения прямой ссылки на сайт
http://www.sqlbooks.ru
на каждой странице, где размещены используемые материалы.

 Начало   Статьи    Книги 
Рейтинг@Mail.ru Rambler's Top100 Alt Упражнения по SQL: обучение, тестирование, сертификация по языку SQL Copyright c 2002-2006. All rights reserved.