Выпуск рассылки "Работа с Oracle" от 02 сентября 2006 года

 

Рассылка  8


Обзорная статья: Регулярные выражения в Oracle (regular expression )

Введение:

В сегодняшнем выпуске мы обсудим новую возможность в 10-ой версии Оракл, а именно использование так называемых  регулярных выражений  .

Мощный механизм регулярных выражений присутствует в различных языках программирования , а также встроен в shell операционной системы Unix.

С версии 10G  мы можем применять регулярные выражения напрямую из SQL.

Это нововведение значительно расширяет наши возможности в обработке и манипуляции строк напрямую из SQL.

Несколько слов о механизме регулярных выражений:

Регулярные выражения - это один из способов поиска подстрок (соответствий) в строках. Осуществляется это с помощью просмотра строки в поисках некоторого шаблона. Регулярное выражение состоит , как правило из обыкновенных символов , как то: букв и цифр , а также из мета-символов (metacharcter ).

Мета-символы - это особые символы , которые позволяют интерпретатору описать логически произвольное собрание символов. Например мета-символ * заменяет ноль или более произвольных символов , а мета-символ ? заменяет один произвольный символ.

Существует масса причин для использования регулярных выражения,приведем лишь несколько выборочных примеров использования данного механизма,   например : поиск повторов в тексте, валидация ввода данных , удаления лишних символов,поиск шаблонов  или синтаксический анализ данных.

Более подробно о регулярных выражениях можно узнать на этих сайтах:

http://regexp.ru/

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
  FROM zipcode
 WHERE REGEXP_LIKE(zip, '\\D');

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)

 

Рейтинг выпуска

 

Рейтинг:

(нет голосов)
 
Для того, чтобы проголосовать за рассылку, Вам необходимо авторизоваться

Дополнительно

 

Для подписки на рассылку введите адрес email и нажмите кнопку "Подписаться".

Адрес email
Нравится   В блог / На сайт В блог / На сайт  Отправить Отправить  Печать Печать  В закладки

Еще в этой рассылке

 

Соседние выпуски:

 

Оставить комментарий

 
Для того, чтобы комментировать выпуски рассылки, Вам необходимо авторизоваться

Подписчику

Вы вводите русские буквы
Забыли пароль?

Автору

Забыли пароль?
 
 
 
 
.