【问题标题】:Oracle regexp_like negating special charOracle regexp_like 否定特殊字符
【发布时间】:2013-05-12 19:33:34
【问题描述】:

我正在使用 Oracle 10g 尝试在 Oracle 10g 的字符类中排除包含 -_ 且带有插入符号的条目。我可以通过以下方式找到包含破折号或下划线的条目:

WITH example
     AS (SELECT 'AAAA-1' n FROM DUAL
         UNION
         SELECT 'AAAAA_1' FROM DUAL
         UNION
         SELECT 'AAAA' FROM DUAL)
SELECT *
  FROM example
 WHERE REGEXP_LIKE (n, '[_\-]')

我知道我可以使用 NOT 但我如何用插入符号 (^) 来否定它?我试过[^_\-] 返回所有内容,[^[_\-]] 什么都不返回,[^(_\-)] 无效。

【问题讨论】:

  • 您可能会发现regexper.com 对尝试答案很有用。它为您提供了正则表达式的可视化表示,并为我节省了数小时

标签: regex oracle oracle10g caret negate


【解决方案1】:

试试:

^[^_-]*$

我相信[^_-] 匹配任何内容,因为它正在寻找除“_”或“-”之外的任何字符的任何字符。与相反的工作原理类似,[_-],它在字符串中的任何位置查找任何字符, '-' 或 '_'。

要改变这一点,接受与您的字符类[^_-] 匹配的任意数量的字符,并用^(行首)和$(行尾)包围。

【讨论】:

  • 这是不正确的。在包含反斜杠的字符串上测试它。
  • 对,Oracle 正则表达式不适合在字符类中转义。
【解决方案2】:

我可能会使用 NOT regexp_like,这样更清楚。但是既然你提到你不想使用NOT,那么我可能会使用这个(再次,更清晰的imo):

select 'Does NOT contain dash or underscore' as val
from dual 
where regexp_instr('ABC123', '[-_]') = 0;

我相信你很快就会有大约 20 个不同的正则表达式版本 ;-)

如果您关心空字符串(null)的特殊处理,请使用简单的 nvl:

nvl(regexp_instr('', '[-_]'),0) = 0; 

我提到这一点是因为使用 regexp_like 不允许这样做(nvl 不是关系运算符,但在这种情况下,我们将 instr 与数字进行比较,因此我们可以在 instr(左手)部分使用 nvl。

但这取决于你是否想说空值中某些字符的存在或不存在;-)

【讨论】:

    【解决方案3】:
    WITH example
         AS (SELECT 'AAAA-1' n FROM DUAL
             UNION
             SELECT 'AAAAA_1' FROM DUAL
             UNION
             SELECT 'AAAA' FROM DUAL
             UNION
             SELECT 'AAAA\1' FROM DUAL
             )
    SELECT *
      FROM example
     WHERE REGEXP_LIKE (n, '^[^_-]*$')
    

    fiddle

    【讨论】:

    • 酷,行得通。为什么锚使这项工作?为什么 * 是必要的?谢谢
    • @user2379830 - 看看 femtoRgon 的回答(关于 * 和锚点)。
    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 2021-02-01
    • 2015-05-30
    • 1970-01-01
    • 2023-01-19
    相关资源
    最近更新 更多