(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

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

Источник: oracle
James F. Koopmann, перевод Моисеенко С.И.

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

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 10.02.2009 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Oracle Database Personal Edition Named User Plus License
Oracle Database Standard Edition 2 Processor License
Oracle Database Personal Edition Named User Plus Software Update License & Support
Oracle Database Standard Edition 2 Named User Plus License
go1984 pro
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
Adobe Photoshop: алхимия дизайна
ЕRP-Форум. Творческие дискуссии о системах автоматизации
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100