2015-09-09 4 views
1

Я использую регулярное выражение, которое отлично работает в тестерах Java/PHP/regex.Oracle SQL Regex не возвращает ожидаемые результаты

\d(?:[()\s#-]*\d){3,} 

Примеры: https://regex101.com/r/oH6jV0/1

Однако, пытаясь использовать тот же регулярное выражение в Oracle SQL не возвращает никаких результатов. Возьмем, например:

select * 
from 
(select column_value str from table(sys.dbms_debug_vc2coll('123','1234','12345','12 135', '1', '12 3'))) 
where regexp_like(str, '\d(?:[()\s#-]*\d){3,}'); 

Это не возвращает строк. Почему это действует по-другому? Я даже использовал тестер регулярных выражений, который делает POSIX ERE, но это все еще работает.

ответ

3

Оракул не поддерживает группы, не связанные с захватом (?:). Вместо этого вам потребуется использовать группу захвата.

Он также не нравится Perl-стиль пробельной мета-символ \s матча внутри персонаж класса [] (это будет соответствовать символам \ и s вместо пробелов). Вместо этого вам нужно будет использовать выражение POSIX [:space:].

SQL Fiddle

Oracle 11g R2 Настройка схемы:

Запрос 1:

select * 
from (
    select column_value str 
    from table(sys.dbms_debug_vc2coll('123','1234','12345','12 135', '1', '12 3')) 
) 
where regexp_like(str, '\d([()[:space:]#-]*\d){3,}') 

Results:

| STR | 
|--------| 
| 1234 | 
| 12345 | 
| 12 135 | 
+0

Прохладный. Это кажется в основном правильным (для чего это), но это не соответствующие пробелы, например. '12 135 '. – Jeremy

+0

@Jeremy Обновлено - swap perl '\ s' для POSIX' [: space:] 'внутри класса символов (как уже упоминалось ранее). – MT0

Смежные вопросы