我正在尝试使用此regexp语句:
select 1 from dual where regexp_like('040', '^[\d\*]{3}$');
没有输出返回,但是有趣的是:
select 1 from dual where regexp_like('040', '^[[:digit:]\*]{3}$');
作品。
为什么?
我使用的是Oracle 11.2。
在第二个示例中,您正在使用POSIX字符类。在第一个示例中,您要混合使用POSIX和“受Perl影响的扩展”。随附的匹配字符列表[ ... ]:
[ ... ]
匹配括号内列表中的任何单个字符。列表中允许使用以下运算符,但其中包含的其他元字符被视为文字。
因此,在中[],反斜杠元字符被视为文字反斜杠,即您要查找的任何字符\,d或*,而 不是 您期望的单个数字-\d正义在括号内的解释不一样。而且您的示例字符串中没有这些文字字符,因此找不到匹配项。
[]
\
d
*
\d
即使在您的第二个版本中,它\*也只会匹配那些文字字符,因此不会添加任何内容。除非您想匹配类似'12*'或的值,否则'1\2'这似乎不太可能。
\*
'12*'
'1\2'
因此,您可能只想简单一些:
select 1 from dual where regexp_like('040', '^\d{3}$');
或等效的:
select 1 from dual where regexp_like('040', '^[[:digit:]]{3}$');