oracle19c中regexp函数的怪异行为



我不是regexp专家,但默认情况下应该区分大小写。我试图弄清楚为什么regexp会给我前两个字符,而第一个字符是大写

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

输出为"Jo">

如果我试过这个

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

输出是相同的,但它应该在开头识别2个非大写字母,所以在这种情况下没有匹配的

然后我对的所有论点都做了同样的尝试

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

同样,输出是"Jo"而不是"哦">

我做错了什么?此行为与fot-substr相同,替换也是如此。在我看来好像忽略了大写字母

您应该首先检查会话中的NLS设置。您所期望的行为是由BINARY排序提供的,您可能没有分配它。

下面是的一个小例子

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');

最新更新