【问题标题】:Oracle Regexp fails in SQLOracle Regexp 在 SQL 中失败
【发布时间】: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。

【问题讨论】:

    标签: sql regex oracle


    【解决方案1】:

    这是因为 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}$');

    【讨论】:

    【解决方案2】:

    在您的第二个示例中,您使用的是 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* 之类的东西。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2022-10-15
    • 1970-01-01
    • 2014-01-18
    • 2020-03-04
    相关资源
    最近更新 更多