Использование регулярных выражений в приложениях баз данных

8 Использование регулярных выражений в приложениях баз данных.

В этой главе описываются регулярные выражения и объясняется, как их использовать в приложениях баз данных..

Руководство по поддержке Oracle Database Globalization для получения информации об использовании функций регулярных выражений SQL в многоязычной среде..

Карманный справочник регулярных выражений Oracle от Джонатана Генника, O’Reilly & Партнеры.

Освоение регулярных выражений Джеффри Э. Фридл, О’Рейли & Партнеры.

8.1 Обзор регулярных выражений.

Регулярное выражение определяет шаблон поиска с использованием метасимволов (которые являются операторами или принадлежат им) и символьных литералов (описанных в справочнике по языку Oracle Database SQL)..

Схема поиска может быть сложной. Например, это регулярное выражение соответствует любой строке, которая начинается с f или ht, за которым следует tp, необязательно, за которым следует s, за которым следует двоеточие (:):

Метасимволы (которые также являются операторами) в предыдущем примере — это круглые скобки, вертикальная черта (|) и вопросительный знак (?). Символьные литералы — это f, ht, tp, s и двоеточие (:)..

Скобки группируют несколько элементов узора в один элемент. Символ вертикальной черты (|) указывает на выбор между элементами по обе стороны от него, f и ht. Знак вопроса (?) Указывает на то, что предыдущий элемент s является необязательным. Таким образом, предыдущее регулярное выражение соответствует этим строкам:

Регулярные выражения — это мощный компонент обработки текста языков программирования Java и PERL. Например, сценарий PERL может считывать содержимое каждого файла HTML в каталоге в одну строковую переменную, а затем использовать регулярное выражение для поиска URL-адресов в этой строке. Эта надежная функция сопоставления с образцом — одна из причин, по которой многие разработчики приложений используют PERL..

8.2 Поддержка регулярных выражений в Oracle SQL.

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

Благодаря централизации логики сопоставления шаблонов в базе данных вы избегаете интенсивной обработки строк наборов результатов SQL приложениями среднего уровня..

Например, заказчики медико-биологических наук часто полагаются на PERL для анализа паттернов биоинформатических данных, хранящихся в огромных базах данных ДНК и белков. Ранее поиск совпадения для последовательности белка, такой как [AG]. ГК [СТ] обрабатывались в среднем ярусе. Функции регулярных выражений SQL приближают логику обработки к данным, тем самым обеспечивая более эффективное решение..

Используя регулярные выражения на стороне сервера для обеспечения ограничений, вы избегаете дублирования логики проверки на нескольких клиентах..

Oracle SQL поддерживает регулярные выражения с условием сопоставления с образцом и функциями, приведенными в Таблице 8-1. Каждый механизм сопоставления с образцом ищет в заданной строке указанный образец (описанный с помощью регулярного выражения), и каждый имеет параметры сопоставления с образцом, описанные в таблице 8-2. У функций есть дополнительные параметры (например, позиция символа, с которой начинается поиск шаблона в строке). Дополнительные сведения см. В справочнике по языку Oracle Database SQL. .

Таблица 8-1 Условие и функции сопоставления с образцом Oracle SQL.

Условие, которое может появиться в предложении WHERE запроса, в результате чего запрос будет возвращать строки, соответствующие заданному шаблону..

Пример: это предложение WHERE идентифицирует сотрудников по имени Стивен или Стивен:

Функция, которая возвращает количество раз, когда данный шаблон встречается в данной строке..

Пример: этот вызов функции возвращает количество раз, когда e (но не E) появляется в строке ‘Albert Einstein’, начиная с позиции символа 7:

(Возвращаемое значение — 1, поскольку опция c определяет соответствие с учетом регистра.)

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

Пример: этот вызов функции возвращает начальную позицию первого действительного адреса электронной почты в столбце hr. сотрудники . Эл. адрес :

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

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

Пример: этот вызов функции ставит пробел после каждого символа в столбце hr. страны. название страны :

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

Пример: этот вызов функции возвращает Oracle, потому что опция x игнорирует пробелы в шаблоне:

В таблице 8-2 описаны параметры сопоставления с образцом, доступные для каждого средства сопоставления с образцом в таблице 8-1..

Таблица 8-2 Параметры сопоставления с образцом для условий и функций сопоставления с образцом Oracle SQL.

Задает соответствие без учета регистра.

Этот вызов функции возвращает 3:

Задает соответствие с учетом регистра.

Этот вызов функции возвращает 2:

Позволяет оператору точка (.) Соответствовать символу новой строки, который не является значением по умолчанию (см. Таблицу 8-3).

В этом вызове функции строка и шаблон поиска совпадают только потому, что указана опция n:

Задает многострочный режим, в котором символ новой строки внутри строки завершает строку. Строка может содержать несколько строк.

Многострочный режим влияет на операторы POSIX Якорь начала строки (^) и Якорь конца строки ($) (описанные в Таблице 8-3), но не на операторы PERL \ A, \ Z и \ z (описанные в Таблице 8-3). Таблица 8-5).

Этот вызов функции возвращает ac:

Игнорирует пробелы в шаблоне поиска. По умолчанию пробельные символы соответствуют сами себе.

Этот вызов функции возвращает abcd:

8.3 Стандарт регулярных выражений Oracle SQL и POSIX.

Реализация регулярных выражений Oracle SQL соответствует этим стандартам:

Проект стандарта IEEE Portable Operating System Interface (POSIX) 1003.2 / D11.2.

Oracle SQL точно следует синтаксису и семантике сопоставления для операторов регулярных выражений, как определено в стандарте POSIX для сопоставления данных ASCII (английский язык). Вы можете найти черновик стандарта POSIX по этому URL-адресу:

Рекомендации по регулярным выражениям Unicode Консорциума Unicode.

Oracle SQL расширяет поддержку регулярных выражений за пределы стандарта POSIX следующими способами:

Расширяет возможности сопоставления для многоязычных данных.

Поддерживает некоторые часто используемые операторы регулярных выражений PERL, которые не включены в стандарт POSIX, но не конфликтуют с ним (например, ярлыки классов символов и модификатор nongreedy (?))

8.4 Операторы в регулярных выражениях Oracle SQL.

Oracle SQL поддерживает набор общих операторов (состоящих из метасимволов), используемых в регулярных выражениях..

Интерпретация метасимволов различается между инструментами, поддерживающими регулярные выражения. Если вы переносите регулярные выражения из другой среды в Oracle Database, убедитесь, что Oracle SQL поддерживает их синтаксис и интерпретирует их так, как вы ожидаете..

8.4.1 Операторы POSIX в регулярных выражениях Oracle SQL.

В таблице 8-3 приведены операторы POSIX, определенные в синтаксисе стандартного расширенного регулярного выражения (ERE) POSIX. Oracle SQL следует точному синтаксису и семантике сопоставления для этих операторов, как определено в стандарте POSIX для сопоставления данных ASCII (английский язык). Любые различия в действиях между Oracle SQL и стандартом POSIX указаны в столбце Описание..

Таблица 8-3 Операторы POSIX в регулярных выражениях Oracle SQL.

Соответствует любому символу в наборе символов базы данных, включая символ новой строки, если вы укажете соответствующий параметр n (см. Таблицу 8-2).

Платформы Linux, UNIX и Windows распознают символ новой строки как символ перевода строки (\ x0a).

Платформы Macintosh распознают символ новой строки как символ возврата каретки (\ x0d).

Примечание. В стандарте POSIX этот оператор соответствует любому английскому символу, кроме NULL и символа новой строки..

Выражение a.b соответствует строкам abb, acb и adb, но не соответствует acc .

Соответствует одному или нескольким вхождениям предыдущего подвыражения (жадный Foot 1).

Выражение a + соответствует строкам a, aa и aaa, но не соответствует ba или ab .

Соответствует нулю или более вхождений предыдущего подвыражения (жадный Footref 1).

Выражение ab * c соответствует строкам ac, abc и abbc, но не соответствует abb или bbc. .

Квантификатор вопросительного знака.

Соответствует нулю или одному вхождению предыдущего подвыражения (жадный Footref 1).

Выражение ab? C соответствует строкам abc и ac, но не соответствует abbc или adc. .

Соответствует ровно m вхождений предыдущего подвыражения.

Выражение a соответствует строке aaa, но не соответствует aa .

Соответствует не менее m вхождений предыдущего подвыражения (жадный Footref 1).

Выражение a соответствует строкам aaa и aaaa, но не соответствует aa .

Соответствует не менее m, но не более n вхождений предыдущего подвыражения (жадный Footref 1).

Выражение a соответствует строкам aaa, aaaa и aaaaa, но не соответствует aa или aaaaaa. .

Список подходящих персонажей.

Соответствует любому одиночному символу в списке в квадратных скобках. В списке все операторы, кроме этих, рассматриваются как литералы:

Класс символов POSIX: [::]

Элемент сопоставления POSIX: [. .]

Класс эквивалентности символов POSIX: [= =]

Тире (-) — это литерал, когда он встречается первым или последним в списке, или как конечная точка диапазона в выражении диапазона, как в [# -]. Правая скобка (]) рассматривается как литерал, если она стоит первой в списке..

Примечание. В стандарте POSIX диапазон включает все элементы сопоставления между началом и концом диапазона в лингвистическом определении текущего языкового стандарта. Таким образом, диапазоны являются лингвистическими, а не диапазонами байтовых значений; семантика выражения диапазона не зависит от набора символов. В Oracle Database лингвистический диапазон определяется параметром инициализации NLS_SORT..

Выражение [abc] соответствует первому символу в строках all, bill и cold, но не соответствует ни одному символу в кукле. .

Список несовпадающих символов.

Соответствует любому одиночному символу, отсутствующему в списке, в скобках.

Для получения информации об операторах и диапазонах в списке символов см. Описание оператора Matching Character List..

Выражение [^ abc] def соответствует строке xdef, но не adef, bdef или cdef. .

Выражение [^ a-i] x соответствует строке jx, но не соответствует ax, fx или ix. .

Соответствует любой альтернативе.

Выражение a | b соответствует символу a или b .

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

Вы можете ссылаться на подвыражение в обратной ссылке.

Выражение (abc)? Def соответствует строкам abcdef и def, но не соответствует abcdefg или xdef .

Соответствует n-му предыдущему подвыражению, где n — целое число от 1 до 9. Обратная ссылка подсчитывает подвыражения слева направо, начиная с открывающей скобки каждого предыдущего подвыражения. Выражение недопустимо, если перед \ n предшествует менее n подвыражений. .

Обратная ссылка позволяет искать повторяющуюся строку, не зная, что это такое..

Использование регулярных выражений в приложениях баз данных использование

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

Выражение (abc | def) xy \ 1 соответствует строкам abcxyabc и defxydef, но не соответствует abcxydef или abcxy .

Выражение ^ (. *) \ 1 $ соответствует строке, состоящей из двух соседних экземпляров одной и той же строки..

Обрабатывает следующий символ как буквальный.

Обратная косая черта (\) позволяет искать символ, который в противном случае рассматривался бы как метасимвол. Используйте последовательные обратные косые черты (\\), чтобы соответствовать самому литералу обратной косой черты.

Выражение abc \ + def соответствует строке abc + def, но не соответствует abcdef или abccdef .

Использование регулярных выражений в приложениях баз данных регулярных выражений

Режим по умолчанию: соответствует началу строки.

Многострочный режим: Foot 2 Соответствует началу любой строки исходной строки.

Выражение ^ def соответствует подстроке def в строке defghi, но не в строке abcdef .

Режим по умолчанию: соответствует концу строки.

Многострочный режим: Footref 2 Соответствует концу любой строки исходной строки.

Выражение def $ соответствует подстроке def в строке abcdef, но не в строке defghi .

Класс символов POSIX.

Соответствует любому символу в указанном классе символов POSIX (например, прописным буквам, цифрам или знакам пунктуации).

Примечание. В английских регулярных выражениях выражения диапазона часто указывают на класс символов. Например, [a-z] обозначает любой символ нижнего регистра. Это соглашение бесполезно в многоязычных средах, где первый и последний символы данного символьного класса могут не совпадать на всех языках..

Выражение [: upper:] +, которое определяет один или несколько последовательных символов верхнего регистра, соответствует подстроке DEF в строке abcDEFghi, но не соответствует ни одной подстроке в abcdefghi .

Оператор элемента сортировки POSIX.

Задает элемент сортировки, определенный в текущей локали. Параметр инициализации NLS_SORT определяет поддерживаемые элементы сопоставления.

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

Выражение [.ch.], Определяющее элемент сортировки ch, соответствует ch в строке chabc, но не соответствует ни одной подстроке в cdefg .

Выражение [a — [. Ch.]] Определяет диапазон от a до ch .

Класс эквивалентности символов POSIX.

Соответствует всем символам, которые принадлежат к тому же классу эквивалентности символов POSIX, что и указанный символ, в текущей локали..

Этот синтаксис должен появиться в списке символов; то есть он должен быть заключен в скобки для списка символов.

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

Выражение [[= n =]], которое определяет символы, эквивалентные n в испанском языке, соответствует как N, так и ñ в строке El Niño. .

Сноска 1 Жадный оператор сопоставляет как можно больше вхождений, позволяя остальной части сопоставления пройти успешно. Чтобы сделать оператор «нежирным», добавьте после него модификатор «нежирный» (?) (См. Таблицу 8-5)..

Сноска 2 Укажите многострочный режим с опцией сопоставления с образцом m, описанной в Таблице 8-2..

8.4.2 Многоязычные расширения Oracle SQL для стандарта POSIX.

При применении к многоязычным данным операторы Oracle SQL POSIX выходят за рамки возможностей сопоставления, указанных в стандарте POSIX..

Таблица 8-4 показывает для каждого оператора POSIX, какие стандарты POSIX определяют его синтаксис и расширяет ли Oracle SQL его семантику для обработки многоязычных данных. Стандарты POSIX — это базовое регулярное выражение (BRE) и расширенное регулярное выражение (ERE)..

Таблица 8-4 Операторы POSIX и многоязычные отношения операторов.

Похожие статьи