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