【问题标题】:PL/SQL REGEXP_LIKE testing string for allowed charactersPL/SQL REGEXP_LIKE 测试字符串的允许字符
【发布时间】:2012-06-27 08:16:32
【问题描述】:

我需要验证提供的字符串是否只允许使用 Oracle 正则表达式 (REGEXP_LIKE) 的字符。 允许的字符是:abcdefghijklmnopqrstuvwxyz0123456789_-。 尝试执行

SELECT CASE 
         WHEN REGEXP_LIKE('abcdefghijklmnopqrstuvwxyz0123456789_-.'
                        , '^[a-z0-9_\-\.]+$') 
         THEN 'true' 
         ELSE 'false' 
END tmp 
FROM dual;

结果为“假”。

对此有什么想法吗?

【问题讨论】:

    标签: regex oracle plsql


    【解决方案1】:

    怎么样:

    SELECT CASE
              WHEN REGEXP_LIKE ('abcdefghijklmnopqrstuvwxyz0123456789_-.',
                                '^([a-z]|[0-9]|_|\-|\.)+$')
              THEN
                 'true'
              ELSE
                 'false'
           END AS tmp
      FROM DUAL;
    

    这能解决你的问题吗? (恐怕我不在电脑前测试这个)

    编辑:

    如果您需要查看导致字符串验证失败的原因,下面的 FWIW 应该删除所有有效字符,只留下无效的字符:

    SELECT REGEXP_REPLACE ('abcdefghijklmnopqrstuvwxyz0123456789_-.',
                           '([a-z]|[0-9]|_|\-|\.)+',
                           '') AS tmp
      FROM DUAL;
    

    您可以测试返回是有效的NULL 和不为空的情况,您可以在验证错误消息中返回无效字符。

    希望对你有帮助...

    【讨论】:

      【解决方案2】:

      破折号“-”必须是右括号[]之间的第一个元素,而反斜杠在[]之间没有特殊含义

      【讨论】:

        【解决方案3】:

        
        SELECT CASE
                 WHEN COUNT(REPLACE((TRANSLATE('abcdefghijklmnopqrstuvwxyz0123456789_-.',
                                               'abcdefghijklmnopqrstuvwxyz0123456789_-.',
                                               ' ')),
                                    ' ',
                                    '')) = 0 THEN
                  'TRUE'
                 ELSE
                  'FALSE'
               END AS CHECK_RESULT
          FROM DUAL
        

        如果预定义列表中不存在任何字符,则此查询将返回 false。

        希望对你有帮助。

        【讨论】:

          【解决方案4】:

          在字符类中,中间的任何符号'-' 都被视为元字符(表示从左到右的符号范围),因此类[a-z0-9_\-\.] 不允许'-'出现在 source_string 中。正确地将'-' 作为符号放入字符类的方法是将其放在字符类的第一个或最后一个位置。

          '.' 在字符类中时,也无需使用斜线转义它,但您的变体不违反语法。

          以下任何正则表达式都能满足您的期望:

          variant_1 => '^[-a-z0-9_.]+$'
          variant_2 => '^[a-z0-9_.-]+$'
          variant_3 => '^[a-z0-9_\.-]+$'
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-06-29
            • 1970-01-01
            • 1970-01-01
            • 2010-12-09
            • 2013-11-03
            相关资源
            最近更新 更多