Прежде всего, синтаксис регулярных выражений не является допустимым oracle* синтаксисом регулярных выражений, но я думаю, что я могу определить, что он должен был означать.
В скобках знак минус обозначает диапазон символов, поэтому в вашем текущем запросе довольно неясно, какой диапазон вы пытаетесь указать.
Кроме того, кажется, что в диалекте Oracle знак минуса должен быть либо последним, либо первым символом в скобках (я не знал, прежде чем ответить на этот вопрос, чтобы быть честным).
^ Означает начало строки, если это первый символ в регулярном выражении, но это означает «все символы, кроме:», когда он находится в квадратных скобках.
Квадратные скобки указывают наборы символов, которые разрешены или, если им предшествует ^, которые не допускаются.
После исправления синтаксической ошибки, упомянутой выше, мы получаем следующее регулярное выражение:
with ex as (
select 'AAA' x from dual union all
select 'AA''A' x from dual union all
select 'AA A' x from dual union all
select 'AA''A' x from dual union all
select 'AA A' from dual union all
select 'A1AA' from dual union all
select 'AA\A' from dual union all
select 'A-AA' from dual union all
select '123fojq3t' from dual
)
select ex.x
from ex
where REGEXP_LIKE(ex.x, '[^A-Za-z \''-]')
Итак, чтобы понять скобки:
[^
A-Za-z any character between a-z or A-Z
, comma
(space)
\ backslash. Backslash is not treated as escape character here, as single quote does not need escaping
'' single quote. We use double quote, so that the Oracle does not think that this is the end of the regexp
- hyphen. It apparently is important that it is the last character here
]
Итак, это некоторый набор символов. Теперь, поскольку есть '^', регулярное выражение как будет означать:
Найдите мне первый символ, который НЕ в наборе выше.
Это легче понять, когда вы используете regexp_instr вместо regexp_like:
with ex as (
select 'AAA' x from dual union all
select 'AA''A' x from dual union all
select 'AA A' x from dual union all
select 'AA''A' x from dual union all
select 'AA A' from dual union all
select 'A1AA' from dual union all
select 'AA\A' from dual union all
select 'A-AA' from dual union all
select '123fojq3t' from dual
)
select ex.x,
REGEXP_instr(ex.x, '[^A-Za-z \''-]')
from ex