регулярное выражение oracle для проверки строки содержит как алфавит, так и число и не содержит специальных символов

#oracle #regexp-like

#Oracle #подобное регулярному выражению

Вопрос:

Как создать регулярное выражение Oracle, чтобы проверить, содержит ли данная строка как число, так и алфавит и не содержит ли она специальных символов. Например,

если строка похожа на ‘kjds327’, она должна возвращать true

если строка ‘dkfsdsf’ или ‘132564’ или ‘asjv @3 #34342fd’, она должна возвращать false

Комментарии:

1. Я отредактировал ваш пост, чтобы удалить все ссылки на pl / sql. Это не другое название Oracle SQL — и ваш вопрос не имеет ничего общего с pl / sql.

Ответ №1:

Вы можете использовать REGEXP_LIKE следующее:

 select * from your_table
 where regexp_like(your_column,'([a-zA-Z][0-9] )|([0-9][a-zA-Z] )')
   and not regexp_like(your_column,'[^a-zA-Z0-9]')
 

db<>скрипка

Вы можете использовать CASE оператор с regexp SELECT предложением this in, если хотите получить true и false в результате.

Комментарии:

1. Для вашего первого шаблона регулярных выражений вы можете просто упростить REGEXP_LIKE(col, '[a-z][0-9]|[0-9][a-z]', 'i') , используя более простой шаблон в режиме без учета регистра.

2. Да. Это также можно сделать @TimBiegeleisen

Ответ №2:

Вы можете выполнить три вызова REGEXP_LIKE для каждого требуемого утверждения:

 SELECT *
FROM yourTable
WHERE
    REGEXP_LIKE(col, '[A-Za-z]') AND       -- contains alphabet
    REGEXP_LIKE(col, '[0-9]')    AND       -- contains number
    NOT REGEXP_LIKE(col, '[^A-Za-z0-9]');  -- no special character
 

Обратите внимание, что здесь я предполагаю, что «специальный» символ — это любой не буквенно-цифровой символ.

Ответ №3:

Для этой задачи вам нужно только одно регулярное выражение.

Минутное размышление покажет, что строка, которая должна содержать по крайней мере одну букву и хотя бы одну цифру и содержит ТОЛЬКО буквы и цифры, должна содержать либо букву, за которой сразу следует цифра, либо цифру, за которой сразу следует буква. Я не буду тратить на это много времени, поскольку это вопрос базовой логики (а не программирования Oracle SQL).

С этим пониманием решение становится ясным. Вам нужно что-то вроде этого (с использованием выражений в скобках POSIX). Не забудьте привязки ^ и $ убедитесь, что сопоставлена вся строка, а не только ее часть.

 with
  sample_inputs(string) as (
    select 'kjds327'        from dual union all
    select 'dkfsdsf'        from dual union all
    select '132564'         from dual union all
    select 'asjv@3#34342fd' from dual union all
    select null             from dual union all
    select '8B'             from dual
  )
select string,
       case when regexp_like(string, 
  '^[[:alnum:]]*(([[:alpha:]][[:digit:]])|([[:digit:]][[:alpha:]]))[[:alnum:]]*



)
then 'true' else 'false' end as test_result
from sample_inputs
;

STRING TEST_RESULT
-------------- -----------
kjds327 true
dkfsdsf false
132564 false
asjv@3#34342fd false
false
8B true