понедельник, 16 мая 2011 г.

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



  Регулярные выражения являются очень полезным механизмом, многих языков программирования. До Версии 10g в Oracle регулярки не было, и приходилось обходиться обычными строковыми функциями поиска подстроки в строке, что было не всегда удобно. В 11g к уже существующим функциям по работе с регулярными выражениями добавилась ещё одна REGEXP_COUNT и расширился функционал 2х старых REGEXP_INSTR и REGEXP_SUBSTR.

  Дальше перечислены функции, которые работают с регулярными выражениями в Oracle и приведены примеры их использования.

  • REGEXP_LIKE(source_char, pattern [, match_param ])
source_char - текст, в котором выполняется поиск
pattern - регулярное выражение
match_param - модификаторы, изменяющие стандартный механизм сопоставления

Эта функция определяет, соответствует ли строка заданному шаблону.

Пример:  
SELECT first_name, last_name
FROM employees
WHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$')
ORDER BY first_name, last_name;

FIRST_NAME           LAST_NAME
-------------------- -------------------------
Steven               King
Steven               Markle
Stephen              Stiles

  • REGEXP_COUNT (source_char, pattern [, position [, match_param]]) (новинка в Oracle 11G)
source_char - текст, в котором выполняется поиск
pattern - регулярное выражение
position - позиция в строке, с которой необходимо начать поиск (по умолчанию 1)
match_param - модификаторы, изменяющие стандартный механизм сопоставления

Возвращает количество вхождений шаблона в строку.

Пример:  
SELECT REGEXP_COUNT('123123123123123', '(12)3', 1, 'i') REGEXP_COUNT
  FROM DUAL;

REGEXP_COUNT
------------
          5

  • REGEXP_INSTR (source_char, pattern [, position [, occurrence [, return_opt [, match_param [, subexpr] ] ] ] ])
source_char - текст, в котором выполняется поиск
pattern - регулярное выражение
position - позиция в строке, с которой необходимо начать поиск (по умолчанию 1)
occurrence - искомое вхождение (по умолчанию 1)
match_param - модификаторы, изменяющие стандартный механизм сопоставления
subexpr - для шаблонов с подвыражениями, это число от 0 до 9, которое указывает, которое из подвыражений, является целью данной функции

Возвращает позицию символа, находящегося в начале или конце соответствия для шаблона.

Пример:
SELECT REGEXP_INSTR('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 2)
"REGEXP_INSTR" FROM DUAL;

REGEXP_INSTR
-------------------
4

  • REGEXP_REPLACE(source_char, pattern [, replace_string [, position [, occurrenсe [, match_param ] ] ] ])
source_char - текст, в котором выполняется поиск
pattern - регулярное выражение
replace_string - шаблон для замены каждого вхождения (может содержать обратные ссылки)
position - позиция в строке, с которой необходимо начать поиск (по умолчанию 1)
occurrence - искомое вхождение (по умолчанию 1)
match_param - модификаторы, изменяющие стандартный механизм сопоставления

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

Пример:
SELECT
 REGEXP_REPLACE(phone_number,
                '([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})',
                '(\1) \2-\3') "REGEXP_REPLACE"
 FROM employees
 ORDER BY "REGEXP_REPLACE";

REGEXP_REPLACE
--------------------------------------------------------------------------------
(515) 123-4444
(515) 123-4567
(515) 123-4568
(515) 123-4569
(515) 123-5555
. . .

  • REGEXP_SUBSTR(source_char, pattern [, position [, occurrence [, match_param [, subexpr ] ] ] ] )
source_char - текст, в котором выполняется поиск
pattern - регулярное выражение
position - позиция в строке, с которой необходимо начать поиск (по умолчанию 1)
occurrence - искомое вхождение (по умолчанию 1)
match_param - модификаторы, изменяющие стандартный механизм сопоставления
subexpr - для шаблонов с подвыражениями, это число от 0 до 9, которое указывает, которое из подвыражений, является целью данной функции

Функция ищет подстроку в строке, которая совпадает с шаблоном.

Пример:
SELECT REGEXP_SUBSTR('1234567890', '(123)(4(56)(78))', 1, 1, 'i', 4)
"REGEXP_SUBSTR" FROM DUAL;

REGEXP_SUBSTR
-------------------
78


  match_param может принимать следующие значения, включая их комбинацию:
  • 'c' - сопоставление, чувствительное к регистру символов (по умолчанию)
  • 'i' - сопоставление, нечувствительное к регистру символов
  • 'n' - разрешить операцию сопоставления с любым символом
  • 'm' - исходный текст разбит на множество строк
  • 'x' - игнорировать пробельные символы (по умолчанию пробельные символы совпадают сами с собой)



  Таблица 1: Метасимволы привязки
МетасимволОписаниеПример
^Привязать выражение к началу строки«^привет» соответствует «привет, как дела», но не «как дела, привет»
$Привязать выражение к концу строки«привет$» соответсвует «как дела, привет», но не «привет, как дела»



  Таблица 2: Квантификаторы и операторы повтора
КвантификаторОписаниеПример
*Встречается 0 и более разREGEXP_REPLACE(str, ’11*’, ’1′)
Результат:
test11 => test1
11123345 => 123345
?Встречается 0 или 1 раз
+Встречается 1 и более разREGEXP_LIKE(str,’5+’)
Результат:
test11 => false
11123345 => true
{m}Встречается ровно m разREGEXP_LIKE(str,’3{2}’)
Результат:
test11 => false
11123345 => true
{m,}Встречается по крайней мере m раз
{m, n}Встречается по крайней мере m раз, но не более n раз



  Таблица 3: Предопределенные символьные классы POSIX
Класс символовОписание
[:alpha:]Буквы
[:lower:]Буквы в нижнем регистре
[:upper:]Буквы в верхнем регистре
[:digit:]Цифры
[:alnum:]Буквы и цифры
[:space:]Пробелы (не печатаемые символы), такие как перевод каретки, новая строка, вертикальная табуляция и подача страницы
[:punct:]Знаки препинания
[:cntrl:]Управляющие символы (не печатаемые)
[:print:]Печатаемые символы



  Таблица 4: Альтернативное сопоставление и группировка выражений
МетасимволОписание
|АльтернативаРазделяет альтернативные варианты, часто используется с оператором группировки ()
( )ГруппаГруппирует подвыражения для альтернативы, квантификатора или ссылочности
[char]Список символовОбозначает список символов; большинство метасимволов в списке символов представляют собой литеры, за исключением символьных классов и метасимволов ^ и -
[^char]Список символовСписок символов, которые не должны присутствовать в строке



  Таблица 5: Метасимвол ссылки
МетасимволОписание
\digitОбратная косая чертаЗа ней следует цифра от 1 до 9, обратная косая черта связана с предыдущим сопоставлением с соответствующим номером заключенного в скобки подвыражения.
(Заметьте: Обратная косая черта может иметь другое значение в регулярном выражении; в зависимости от контекста она может означать также символ Escape



 Полный список символов, которые можно использовать в регулярных выражениях Oracle можно посмотреть по ссылке: Operators in Oracle SQL Regular Expressions

 При написании этого текста использовались материалы со страниц: http://download.oracle.com и http://apps-oracle.ru/regular_expression-2/


2 комментария: