oracle正则表达式检查字符串是否包含字母和数字且不包含特殊字符
oracle regular expression to check string contains both alphabet and number and does not contain special characters
如何创建 Oracle 正则表达式来检查给定的字符串是否同时包含数字和字母并且不包含特殊字符。
例如,
if the string is like 'kjds327' it must return true
if the string is 'dkfsdsf' or '132564' or 'asjv@3#34342fd' it must
return false
对于每个必需的断言,您可以对 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
请注意,这里我假设“特殊”字符是任何非字母数字字符。
您可以按如下方式使用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]')
如果您想要结果为真和假,则可以在 SELECT
子句中使用带有此 regexp
的 CASE
语句。
您只需要一个正则表达式即可完成此任务。
稍加思考就会发现,一个字符串必须至少包含一个字母和至少一个数字,并且仅包含字母和数字,必须包含紧跟其后的字母一个数字,或一个数字紧跟一个字母。我不会在这上面花太多时间,因为这是一个基本逻辑问题(不是 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
如何创建 Oracle 正则表达式来检查给定的字符串是否同时包含数字和字母并且不包含特殊字符。 例如,
if the string is like 'kjds327' it must return true
if the string is 'dkfsdsf' or '132564' or 'asjv@3#34342fd' it must return false
对于每个必需的断言,您可以对 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
请注意,这里我假设“特殊”字符是任何非字母数字字符。
您可以按如下方式使用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]')
如果您想要结果为真和假,则可以在 SELECT
子句中使用带有此 regexp
的 CASE
语句。
您只需要一个正则表达式即可完成此任务。
稍加思考就会发现,一个字符串必须至少包含一个字母和至少一个数字,并且仅包含字母和数字,必须包含紧跟其后的字母一个数字,或一个数字紧跟一个字母。我不会在这上面花太多时间,因为这是一个基本逻辑问题(不是 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