2016-10-06 2 views
4

я испытывал регулярное выражение в Oracle SQL и нашел что-то я не мог понять:Oracle REGEXP_LIKE не работает, как ожидалось

-- NO MATCH 
SELECT 1 FROM DUAL WHERE REGEXP_LIKE ('Professor Frank', '(^|\s)Prof[^\s]*(\s|$)'); 

Выше не совпадают, а следующие матчи:

-- MATCH 
SELECT 1 FROM DUAL WHERE REGEXP_LIKE ('Professor Frank', '(^|\s)Prof\S*(\s|$)'); 

В других вариантах регулярных выражений он будет \bProf[^\s]*\b по сравнению с \bProf\S*\b и аналогичные результаты. Примечание. Регулярное выражение SQL SQL не имеет \b или границы слова.

Вопрос: Почему не [^\s]* и \S* работают одинаково в Oracle SQL?

Я замечаю, что если я удалю (\s|$) в конце, первое регулярное выражение будет соответствовать.

+1

Если вы замените \ s внутри класса символа пробелом в первом примере, он работает как ожидалось. Интересно, я бы ожидал, что космический персонаж будет включен в \ s! –

+0

Попробуйте выполнить обратную косую черту в строке, например. '\\ s' – Barmar

+1

\ s - это escape-последовательность для пробела, но NOT в соответствующем наборе символов (то есть [.....]). В соответствующем наборе символов только два символа имеют особое значение, - для диапазонов и] для закрытия диапазона. Они не могут быть спасены; если необходимо, в наборе соответствия] всегда должен быть первым символом и - должен быть первым или последним (лучше всего оставить его до конца набора соответствия). – mathguy

ответ

3

В Oracle регулярных выражений, \s действительно последовательность выхода для пространства, но не в наборе соответствия символов (то есть, [.....] или [^....] за исключением одного символа). В соответствующем наборе символов только два символа имеют особое значение: - для диапазонов и ] для закрытия набора перечислений. Они не могут быть спасены; если необходимо в соответствующем наборе, ] всегда должен быть первым символом сразу после открытия [ (это ТОЛЬКО положение, в котором закрытие ] обозначает себя как символ и не обозначает конец соответствующего набора), и - должен быть первым или последним (лучше оставить его всегда до конца набора соответствия) - где-либо еще он рассматривается как маркер диапазона. Чтобы включить (или исключить, используя синтаксис [^.....]) пробел, просто введите фактическое физическое пространство в наборе соответствия.

Редактировать: То, что я сказал выше, не совсем правильно. В соответствующем наборе есть еще один специальный символ: ^. Если он используется в первой позиции, это означает «соответствовать любому символу OTHER THAN». В любой другой позиции он выступает за себя. Например, '[^^]' будет соответствовать любому одиночному символу OTHER THAN ^ (первый ^ имеет особое значение, второе - для себя). И закрывающая скобка ] обозначает себя, если она является вторым символом в скобках, если первый символ равен ^ (с его СПЕЦИАЛЬНЫМ значением). То есть, чтобы соответствовать любому одиночному символу OTHER THAN ], мы можем использовать соответствующий шаблон '[^]]'.

+1

Чтобы исключить все символы пробела (вкладка, новая строка, вертикальная вкладка, подача формы, возврат каретки или пробел), вы можете использовать класс символов POSIX, например. '[^ [: space:]]' – Unoembre

+0

@Unoembre Так оно и есть. Я считаю, что Oracle не разрешает расширения perl (как и большинство других реализаций регулярных выражений), а затем ошибку! : -b Вы вошли в зону Oracle ..... –

+0

@Gary_W - «ошибка» - это то, что работает иначе, чем говорит документация, поэтому это не может быть ошибкой. Возможно, вы не согласны с выбором Oracle, это совсем другое дело. Кроме того, Oracle разрешает расширения perl (очевидно, поскольку '\ s' IS распознается вне сопоставимых наборов!) - см. Https://docs.oracle.com/cd/B19306_01/server.102/b14200/ap_posix003.htm – mathguy

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