Oracle Regexp在SQL中失败

时间:2015-01-08 10:40:15

标签: sql regex oracle

我正在尝试使用此正则表达式语句:

select 1 from dual where regexp_like('040', '^[\d\*]{3}$');

没有输出,但有趣的是说:

select 1 from dual where regexp_like('040', '^[[:digit:]\*]{3}$');

作品。

为什么?

我在Oracle 11.2上。

2 个答案:

答案 0 :(得分:2)

这是因为Oracle仅支持POSIX正则表达式标准,而不是您在第一个示例中使用的Perl语法。

Oracle文档:http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm#CHDJGBGG POSIX正则表达式标准:http://pubs.opengroup.org/onlinepubs/007908799/xbd/re.html

编辑:正如Alex Poole指出Oracle确实支持自Oracle 10gR2以来的Perl正则表达式语法。在我的本地11gR2安装上试用你的例子表明你的语法错误,以下工作正常:

SELECT 1 FROM dual WHERE regexp_like('040', '^\d{3}$');

答案 1 :(得分:1)

在第二个示例中,您使用的是POSIX字符类。在您的第一个示例中,您将混合POSIX和'Perl-influenced extensions'[ ... ]中包含的matching character-list

  

匹配括号内列表中的任何单个字符。列表中允许使用以下运算符,但包含的其他元字符被视为文字...

因此,在[]中,反斜杠元字符被视为字面反斜杠,您可以在其中查找任何字符\d或{{1}并且对于您想要的单个数字 - *并不像括号内那样被解释。并且您的示例字符串中没有任何这些文字字符,因此它找不到匹配项。

即使在您的第二个版本中,\d也只会匹配这些文字字符,因此不会添加任何内容;除非您想匹配\*'12*'之类的值,这似乎不太可能。

所以你可能只想要更简单:

'1\2'

或同等的:

select 1 from dual where regexp_like('040', '^\d{3}$');