Выпуск рассылки "Работа с Oracle" от 02 сентября 2006 года
Рассылка 8
Введение: В сегодняшнем выпуске мы обсудим новую возможность в 10-ой версии Оракл, а именно использование так называемых регулярных выражений . Мощный механизм регулярных выражений присутствует в различных языках программирования , а также встроен в shell операционной системы Unix. С версии 10G мы можем применять регулярные выражения напрямую из SQL. Это нововведение значительно расширяет наши возможности в обработке и манипуляции строк напрямую из SQL. Несколько слов о механизме регулярных выражений: Регулярные выражения - это один из способов поиска подстрок (соответствий) в строках. Осуществляется это с помощью просмотра строки в поисках некоторого шаблона. Регулярное выражение состоит , как правило из обыкновенных символов , как то: букв и цифр , а также из мета-символов (metacharcter ). Мета-символы - это особые символы , которые позволяют интерпретатору описать логически произвольное собрание символов. Например мета-символ * заменяет ноль или более произвольных символов , а мета-символ ? заменяет один произвольный символ. Существует масса причин для использования регулярных выражения,приведем лишь несколько выборочных примеров использования данного механизма, например : поиск повторов в тексте, валидация ввода данных , удаления лишних символов,поиск шаблонов или синтаксический анализ данных. Более подробно о регулярных выражениях можно узнать на этих сайтах: http://www.rsdn.ru/article/alg/regular.xml Примеры использования регулярных выражений в Оракл: 1) Мета-символы : Мета-символ . - заменяет любой символ кроме новой строки Выражение a.b подходит для : acb, abba,xfgajbhjh, jhakbdl lkahblkj Важно заметить ,что поиск шаблона a.b ведётся по всему заданному тексту до первого совпадения, поэтому в последнем примере "jhakbdl lkahblkj" мы получим лишь первое совпадение akb , а не второе ahb. Мета-cимвол: ^ - заменяет начало строки $ - заменяет конец строки * - ноль или более произвольных символов ? - ноль или один раз произвольный символ + - один или более произвольных символов {m} - точно m раз предыдущий символ или группа , например a{3} = aaa {m,} - m или более раз предыдущий символ или группа, например a{2,}= aa , aaa, aaaaa {m,n} - минимум m или максимум n раз предыдущий символ или группа [ ] - замена любым символом внутри квадратных скобок , например [abc]*= ajhjh , bskjk , cjkjkjk Вариант [^abc] - означает любой символ который не находится в скобках | - означает оператор или , например a|b ( ) - логически объединяет символы внутри скобок в одну логическую единицу \\n - заменяет группу номер n , например (abc)j\\1=abcjabc \\ - знак переключения кода (escape character ) , признак использования специальных символов в качестве обычных. В дополнение к мета-символам указанным выше Оракл поддерживает использование стандарта языка Perl, например: \\d - означает любую цифру , например выражение для проверки ввода телефонного номера ^\\(\\d{3}\\) \\d{3}-\\d{4}$ Здесь ищем строку , которая начинается с 3-х значного числа в скобках (поэтому используем перед символом скобка знак переключения \\ , чтобы интерпретировать ( или ) как скобку , а не как мета-символ группы) , потом пробел за которым следует ещё раз 3-х значное число, дефис и в заключении 4-х значное число. Номер (123) 456-3456 подойдет , а номер (234) 3456-3234 будет отвергнут. \\D - означает любой символ кроме цифр, например \\d\\D может означать 2b или 2$, но не 22 \\w - означает любой алфавитно-цифровой символ символ включая символ _ Например проверка допустимого адреса электронной почты \\w+@\\w+(\\.\\w+)+ Здесь ищем любой алфавитно-цифровой символ повторяющийся один или более раз (то есть просто слово), затем символ @, затем снова слово, а после этого ищем шаблон состоящий из символа . (поэтому используем знак переключения \\) и слова и этот шаблон может повторятся один или несколько раз. Электронный адрес eldar52@mail.ru или eldar52@mail.org.ru подойдет , а этот eldar52@mail. будет отвергнут. Если нам известно , что в допустимый адрес имеет следующий вид name@mail.domain.something , тогда изменим регулярное выражение на поиск шаблона точно 2 раза \\w+@\\w+(\\.\\w+){2}[$ ] {2} - означает , что шаблон (\\.\\w+) должен встречаться именно 2 раза , а за ним должно следовать либо конец строки либо пробел. \\s - символ пробел \\S - любой символ кроме пробела 2) Функции регулярных выражений в Оракл. regexp_like regexp_instr regexp_substr regexp_replace Как можно заметить из вышеуказанного списка регулярные выражения значительно добавляют и усиливают существующие функции для работы с текстом , как то like, substr,replace и instr. a. regexp_like - используется подобно оператору like в части where или же при определении ограничения на таблицу (constraint) Пример #1: SQL> select zip from zipcode; ZIP ---------- 123 123fg 345 Найти индекс в котором есть не цифирные символы SELECT zip ZIP ---------- 123fg Пример #2: Вернёмся к нашему примеру проверки телефонного номера. Создадим ограничения на таблицу так, чтобы нельзя было ввести телефонный номер в не правильном формате. CREATE TABLE contacts( l_name VARCHAR2(30), p_number VARCHAR2(30) CONSTRAINT p_number_format CHECK ( REGEXP_LIKE ( p_number, '^\\(\\d{3}\\) \\d{3}-\\d{4}$' ) )); SQL> insert into contacts values ('michael','(345) 345-4567'); 1 row created. SQL> insert into contacts values ('michael2','345 345-4567'); insert into contacts values ('michael2','345 345-4567') * ERROR at line 1: ORA-02290: check constraint (HR.P_NUMBER_FORMAT) violated
В следующем выпуске мы продолжим описание функций регулярных выражений с дополнительными примерами. Если у вас есть интересные примеры использования регулярных приложений , дополнения, вопросы или замечания , тогда высылайте на адрес автора рассылки (eldar52@mail.ru) и мы постараемся ответить вам или опубликовать ваш материал. В Интернете: Подробное описание событий Оракла (Oracle events)
http://www.psoug.org/reference/trace_tkprof.html Дежурный TIP : Как узнать когда был изменён пароль определённого пользователя.
select name, ptime from sys.user$ where name='ХХХХХХ'; Новости: Вышел patcheset 9.2.0.8 Опрос: [Poll 602] С уважением. Автор рассылки. Eldar (eldar52@mail.ru) |
Рейтинг выпуска
Еще в этой рассылке
Соседние выпуски:
- →Работа с Oracle (02.09.06)
- →Работа с Oracle (24.06.06)
- →Работа с Oracle (18.02.06)
