【发布时间】:2015-03-06 10:47:56
【问题描述】:
我正在尝试使用这个正则表达式语句:
select 1 from dual where regexp_like('040', '^[\d\*]{3}$');
没有返回输出,但说起来很有趣:
select 1 from dual where regexp_like('040', '^[[:digit:]\*]{3}$');
有效。
为什么?
我使用的是 Oracle 11.2。
【问题讨论】:
我正在尝试使用这个正则表达式语句:
select 1 from dual where regexp_like('040', '^[\d\*]{3}$');
没有返回输出,但说起来很有趣:
select 1 from dual where regexp_like('040', '^[[:digit:]\*]{3}$');
有效。
为什么?
我使用的是 Oracle 11.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 10gR2 以来,Oracle 实际上确实支持 Perl 正则表达式语法。在我的本地 11gR2 安装上尝试您的示例表明您的语法错误,以下工作正常:
SELECT 1 FROM dual WHERE regexp_like('040', '^\d{3}$');
【讨论】:
在您的第二个示例中,您使用的是 POSIX 字符类。在您的第一个示例中,您混合了 POSIX 和 'Perl-influenced extensions'。 matching character-list 括在[ ... ] 中:
匹配括号内列表中的任何单个字符。列表中允许使用以下运算符,但包含的其他元字符被视为文字...
所以在[] 中,反斜杠元字符被视为文字反斜杠,您正在寻找任何字符\、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}$');
【讨论】:
'^[[:digit:]*]{3}$',因为我也需要能够匹配040* 之类的东西。谢谢!