【问题标题】:Oracle SQL Regex not returning expected resultsOracle SQL 正则表达式未返回预期结果
【发布时间】:2015-12-06 00:56:58
【问题描述】:

我正在使用一个在 Java/PHP/regex 测试器中完美运行的正则表达式。

\d(?:[()\s#-]*\d){3,}

示例:https://regex101.com/r/oH6jV0/1

但是,尝试在 Oracle SQL 中使用相同的正则表达式不会返回任何结果。举个例子:

select *
from
(select column_value str from table(sys.dbms_debug_vc2coll('123','1234','12345','12 135', '1', '12 3')))
where regexp_like(str, '\d(?:[()\s#-]*\d){3,}');

这不会返回任何行。为什么这种行为如此不同?我什至使用了一个执行 POSIX ERE 的正则表达式测试器,但它仍然有效。

【问题讨论】:

    标签: regex oracle


    【解决方案1】:

    Oracle 不支持非捕获组(?:)。您将需要改用捕获组。

    它也不喜欢字符类 [] 中的 perl 样式的空白元字符 \s 匹配(它将匹配字符 \s 而不是空白)。您需要改用 POSIX 表达式 [:space:]

    SQL Fiddle

    Oracle 11g R2 架构设置

    查询 1

    select *
    from (
      select column_value str
      from   table(sys.dbms_debug_vc2coll('123','1234','12345','12 135', '1', '12 3'))
    )
    where regexp_like(str, '\d([()[:space:]#-]*\d){3,}')
    

    Results

    |    STR |
    |--------|
    |   1234 |
    |  12345 |
    | 12 135 |
    

    【讨论】:

    • 酷。这似乎大部分是正确的(就它的本质而言),但它不匹配空格,例如'12 135'。
    • @Jeremy 更新 - 在字符类中将 perl \s 替换为 POSIX [:space:](正如其他人已经提到的那样)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多