2013-05-17 3 views
1

Я использую Oracle 10g, пытаясь исключить записи, содержащие - или _ с кареткой в ​​классе символов в Oracle 10g. Я могу найти записи, содержащие тире или знак подчеркивания через:Oracle regexp_like отрицает специальный char

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

Вы можете найти HTTP: // WWW .regexper.com/полезно для проверки ответов. Это дает вам визуальное представление регулярного выражения и сэкономило мне часы – Dave

ответ

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

+0

Круто, что работает. Почему анкеры делают эту работу? и почему это необходимо? Спасибо – mbow

+0

@ user2379830 - Посмотрите на ответ femtoRgon (о '*' и якорях). –

1

Try:

^[^_-]*$ 

Я считаю, что [^_-] соответствует ничего, потому что он ищет Любой символ, который ничего, кроме «_» или «-». Подобно противоположному, который работает, [_-], который находит любой символ в любом месте строки, является либо a '-', либо '_'.

Чтобы изменить это, принять любое количество символов, соответствующих вам символьный класс [^_-] и окружить ^ (начало строки) и $ (конец строки).

+0

Это неверно. Проверьте его на строке, содержащей обратную косую черту. –

+0

Правильно, регулярные выражения Oracle не идут на экранирование в классах символов. – femtoRgon

0

Я бы, вероятно, использовал NOT regexp_like, что более понятно. Но так как вы упомянули, вы не хотите использовать NOT, то я бы, вероятно, использовать это (опять же, более ясно имо):

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 с числом, поэтому мы можем использовать nvl в части instr (слева).

Но получил это зависит от того, хотите ли вы что-нибудь сказать о существовании или несуществовании некоторых символов в нуль ;-)

+0

sweet спасибо за ответ – mbow