Oracle regexp_like否定特殊字符

时间:2013-05-17 15:04:24

标签: regex oracle oracle10g caret negate

我正在使用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,但如何使用插入符(^)来否定这一点?我已尝试[^_\-]返回所有内容,[^[_\-]]不返回任何内容,[^(_\-)]无效。

3 个答案:

答案 0 :(得分:1)

尝试:

^[^_-]*$

我相信[^_-]匹配任何内容,因为它正在寻找任何字符,而不是'_'或' - '。类似于相反的,[_-],它在字符串中的任何位置找到任何字符, 是' - '或'_'。

要更改它,请接受与字符类[^_-]匹配的任意数量的字符,并使用^(行首)和$(行尾)。

答案 1 :(得分:0)

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

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

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

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

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

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

但是,这取决于你是否想要在null中对某些字符的存在或不存在说些什么; - )

答案 2 :(得分:0)

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