小编典典

Oracle Regexp在SQL中失败

sql

我正在尝试使用此regexp语句:

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

没有输出返回,但是有趣的是:

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

作品。

为什么?

我使用的是Oracle 11.2。


阅读 163

收藏
2021-04-15

共1个答案

小编典典

在第二个示例中,您正在使用POSIX字符类。在第一个示例中,您要混合使用POSIX和“受Perl影响的扩展”。随附的匹配字符列表[ ... ]

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

因此,在中[],反斜杠元字符被视为文字反斜杠,即您要查找的任何字符\d*,而 不是
您期望的单个数字-\d正义在括号内的解释不一样。而且您的示例字符串中没有这些文字字符,因此找不到匹配项。

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

因此,您可能只想简单一些:

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

或等效的:

select 1 from dual where regexp_like('040', '^[[:digit:]]{3}$');
2021-04-15