我正在尝试使用此正则表达式语句:
select 1 from dual where regexp_like('040', '^[\d\*]{3}$');
没有输出,但有趣的是说:
select 1 from dual where regexp_like('040', '^[[:digit:]\*]{3}$');
作品。
为什么?
我在Oracle 11.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}$');