Использование регулярного выражения на основе Java для запроса Oracle - PullRequest
1 голос
/ 03 февраля 2012

Мне нужно написать запрос, в котором регулярное выражение, основанное на Java (я верю стандарту POSIX), должно отправлять хранимую процедуру. Который будет использовать эту строку регулярного выражения для запроса базы данных, чтобы получить только те записи, которые описывают регулярное выражение.

Я читал о Регулярных выражениях и увидел, что регулярные выражения оракула не совпадают с Java, т.е.

С версией 10g Oracle Database предлагает 4 функции регулярного выражения, которые вы можно использовать в операторах SQL и PL / SQL. Эти функции реализуют Стандарт расширенных регулярных выражений (ERE) POSIX. Oracle полностью поддерживает сортировку последовательностей и классов эквивалентности в скобках выражения. Параметр NLS_SORT определяет используемый языковой стандарт POSIX, который определяет доступные последовательности сортировки и эквивалентность классы.

Однако Oracle не совсем точно реализует стандарт POSIX ERE. Это отклоняется в трех областях. Во-первых, Oracle поддерживает обратные ссылки \ 1 до \ 9 в регулярном выражении. Стандарт POSIX ERE не поддерживать их, хотя POSIX BRE и делает. В полном соответствии двигатель от \ 1 до \ 9 будет запрещен. Стандарт POSIX гласит это запрещено экранировать персонажа, который не является метасимволом с обратная косая черта. Oracle позволяет это и просто игнорирует обратную косую черту. Например. \ z идентичен z в Oracle. В результате все POSIX ERE с Oracle можно использовать регулярные выражения, но некоторые регулярные выражения, которые работают в Oracle, могут привести к ошибке в полностью POSIX-совместимый движок. Очевидно, что если вы работаете только с Oracle, эти различия не имеют значения.

Третье отличие более тонкое. Это не вызовет никаких ошибок, но может привести к различным совпадениям. Как я объяснил в теме о Стандарт POSIX, он требует, чтобы двигатель регулярных выражений возвращал самый длинный совпадать в случае чередования. Двигатель Oracle не делает этого. это традиционный механизм NFA, как и все обсуждаемые не-POSIX-регулярные выражения на этом сайте.

Если вы работали с регулярными выражениями в других программах языки, помните, что POSIX не поддерживает непечатаемые символ экранируется как \ t для табуляции или \ n для новой строки. Ты можешь использовать они с движком POSIX на языке программирования, таком как C ++, потому что компилятор C ++ будет интерпретировать \ t и \ n в строковых константах. В Операторы SQL, вам нужно будет ввести фактическую вкладку или разрыв строки в строка с вашим регулярным выражением, чтобы она соответствовала табуляции или строке перерыв. Механизм регулярных выражений Oracle будет интерпретировать строку '\ t' как регулярное выражение t при передаче в качестве параметра регулярного выражения.

Просто интересно, есть ли какая-то помощь, которую я могу использовать для решения этой проблемы? Или мне нужно перенести регулярное выражение Java в регулярное выражение PLSQL?

Регулярное выражение, которое мы собираемся использовать, будет широко использоваться в Java. Существует несколько примеров использования того же регулярного выражения для хранимых процедур оракула. Один из образцов регулярное выражение составляет .*__.*__^ABC

Полагаю, было бы намного полезнее, если бы я мог знать, каковы несовместимости в этих 2 версиях:)

1 Ответ

1 голос
/ 06 февраля 2012

Сначала соберите все используемые / ожидаемые регулярные выражения и выполните несколько запросов к образцу / тестовой таблице, чтобы увидеть, есть ли регулярные выражения, которые работают в Java, но не в Oracle. Возможно, никаких проблем не возникнет, поскольку в документации Oracle говорится, что она поддерживает стандарты регулярных выражений POSIX и Unicode и улучшает их.

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

...