я испытывал регулярное выражение в 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|$)
в конце, первое регулярное выражение будет соответствовать.
Если вы замените \ s внутри класса символа пробелом в первом примере, он работает как ожидалось. Интересно, я бы ожидал, что космический персонаж будет включен в \ s! –
Попробуйте выполнить обратную косую черту в строке, например. '\\ s' – Barmar
\ s - это escape-последовательность для пробела, но NOT в соответствующем наборе символов (то есть [.....]). В соответствующем наборе символов только два символа имеют особое значение, - для диапазонов и] для закрытия диапазона. Они не могут быть спасены; если необходимо, в наборе соответствия] всегда должен быть первым символом и - должен быть первым или последним (лучше всего оставить его до конца набора соответствия). – mathguy