为什么REGEXP_LIKE函数将字母'e'视为大写而不是小写?

时间:2011-12-14 17:17:46

标签: sql regex oracle stored-procedures plsql

在我的pl / sql脚本中,Oracle在使用[:upper:]字符类语法进行搜索时将字母'e'视为大写。

REGEXP_LIKE('e', '[:upper:]')

REGEXP_LIKE('e', '[:lower:]')

可在此处找到相关的Oracle文档:

Oracle - Multilingual Regular Expression Syntax

Oracle - REGEXP_LIKE

2 个答案:

答案 0 :(得分:11)

当您使用方括号[]包围它们时,字符类似乎有效:

SQL> SELECT * FROM dual WHERE regexp_like('e', '[[:upper:]]');

DUMMY
-----

SQL> SELECT * FROM dual WHERE regexp_like('E', '[[:upper:]]');

DUMMY
-----
X

当您使用单一括号时,Oracle会将它们视为字符列表,以下是有效的,因为u包含在字符串:upper:中:

SQL> SELECT * FROM dual WHERE regexp_like('u', '[:upper:]');

DUMMY
-----
X

答案 1 :(得分:4)

作为对文森特答案的补充说明,这是一个常见的正则表达式陷阱。参见例如Why is using a POSIX character class in my regex pattern giving unexpected results? - 您可以将Perl作为Oracle SQL读取,因为正则表达式问题和解决方案与您的情况相同

这也是用GNU grep说明的相同案例:

$ echo E | grep -e '[:upper:]'
grep: character class syntax is [[:space:]], not [:space:]
$ echo E | grep -e '[[:upper:]]'
E
$

所以这里没有特别的Oracle。