【问题标题】:oracle regular expression to check string contains both alphabet and number and does not contain special charactersoracle正则表达式检查字符串是否包含字母和数字且不包含特殊字符
【发布时间】:2021-01-01 06:01:19
【问题描述】:

如何创建一个Oracle正则表达式来检查给定的字符串是否同时包含数字和字母并且不包含特殊字符。 例如,

如果字符串类似于“kjds327”,则它必须返回 true

如果字符串是 'dkfsdsf' 或 '132564' 或 'asjv@3#34342fd' 它必须 返回假

【问题讨论】:

  • 我编辑了您的帖子以删除所有对 pl/sql 的引用。这不是 Oracle SQL 的另一个名称 - 您的问题与 pl/sql 无关。

标签: oracle regexp-like


【解决方案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<>fiddle

如果您想要结果为真和假,您可以在SELECT 子句中使用CASE 语句和regexp

【讨论】:

  • 对于您的第一个正则表达式模式,您可以简化为REGEXP_LIKE(col, '[a-z][0-9]|[0-9][a-z]', 'i'),在不区分大小写模式下使用更简单的模式。
  • 是的。这也可以做到@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 
    

    【讨论】:

      猜你喜欢
      • 2022-12-28
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      相关资源
      最近更新 更多