странное поведение функций регулярного выражения в Oracle 19c

Я не эксперт по регулярным выражениям, но по умолчанию должен быть чувствителен к регистру. Я пытаюсь понять, почему регулярное выражение дает мне первые 2 символа, когда первый - заглавный

select regexp_substr('JohnFoo','[a-z]{2}') from dual;

вывод - "Джо"

если бы я попробовал это

select regexp_substr('JohnFoo','^[a-z]{2}') from dual;

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

затем я попробовал то же самое со всеми аргументами

select regexp_substr('JohnFoo','[a-z]{2}',1,1,'c') from dual;

снова вывод "Jo" instrad "oh"

что я делаю не так? это то же поведение fot substr, также replace. мне кажется, что игнорировать столицы

1 ответ

Вы должны сначала проверить NLSнастройка в вашей сессии. Ожидаемое поведение обеспечивается BINARY sort, который вы, вероятно, не назначили.

Ниже небольшой пример

ALTER SESSION SET NLS_COMP=BINARY;
ALTER SESSION SET NLS_SORT=BINARY;

select regexp_substr('JohnFoo','[a-z]{2}') from dual;

RE
--
oh

ALTER SESSION SET NLS_COMP=LINGUISTIC;
ALTER SESSION SET NLS_SORT=BINARY_CI;

select regexp_substr('JohnFoo','[a-z]{2}') from dual;

RE
--
Jo

Чтобы получить фактические значения сеанса, используйте запрос

select * from NLS_SESSION_PARAMETERS 
where parameter in ('NLS_COMP','NLS_SORT');
Другие вопросы по тегам