【问题标题】:Oracle SQL REGEXP_LIKE not returning expected resultOracle SQL REGEXP_LIKE 未返回预期结果
【发布时间】:2016-04-29 13:53:02
【问题描述】:

您知道为什么 Oracle 11g R2 Express Edition (XE) 上的这条 SQL 命令没有返回预期结果吗?

SELECT 'X'
FROM dual
WHERE REGEXP_LIKE('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)', '^.*MSIE [5-8](?:\.[0-9]+)?(?!.*Trident\/(?:[5-9]|1[0-9])\.0).*$');

当我使用站点https://regex101.com/ 时,模式匹配...

【问题讨论】:

  • 您应该使用regexp_substr 来获得实际匹配。使用 regexp_like 会告诉你模式是否匹配。在这种情况下,如果为 true,您将获得 x,否则将无行。
  • Oracle 正则表达式引擎不支持前瞻。如果您尝试获取子字符串,我建议您使用regexp_substr,然后使用regexp_replace 替换不必要的部分。如果您只需要与regexp_like 匹配行,您可能根本不需要它们。
  • 感谢您的回答,但此命令不返回任何内容。因此,对我来说,Oracle 在正则表达式(第二个参数)中无法识别某些内容。但是什么?选择 REGEXP_SUBSTR('Mozilla/4.0 (兼容; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)', '^.*MSIE [ 5-8](?:\.[0-9]+)?(?!.*Trident\/(?:[5-9]|1[0-9])\.0).*$')来自双重的“REGEXP_SUBSTR”;

标签: sql oracle regexp-like


【解决方案1】:

我想知道 regexe101 是如何匹配的,因为您正在寻找带有模式的“...Trident/4.0 ...”,该模式只需要斜杠后的 5 到 9 之间的数字(绝对不包含4,所以 regex101 不应该匹配!)。

无论如何,在更正此问题并删除那些 ?: 和 ?!修饰符,显然没有被 11gR2(甚至 12c)正确处理,它可以工作:

SELECT 'X'
FROM dual
WHERE REGEXP_LIKE(
    'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)'
  , '^.*MSIE [5-8](?:\.[0-9]+)?(.*Trident\/([4-9]|1[0-9])\.0).*$');

【讨论】:

  • 感谢您的回答。使用 ?!,它应该被视为否定。因此,请避免选择 Trident/ 数字为 5 到 9 + .0(示例:Trident/5.0)或数字 1x(其中 x = 0 到 9)(示例:Trident /11.0)
  • 啊,我明白了...但是 afaik,Oracle 正则表达式不知道负前瞻/后瞻,所以你必须将你的模式修改为 '^.*MSIE [5-8](\.[0-9]+)?(.*Trident\/([^5-9]|1[0-9])\.0).*$
猜你喜欢
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多