PL / SQL REGEXP_LIKE测试允许字符的字符串

时间:2012-06-27 08:16:33

标签: regex oracle plsql

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

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

导致'假'。

有关于此的任何想法吗?

4 个答案:

答案 0 :(得分:1)

怎么样:

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

这能解决吗? (我不是在PC前面测试这个我害怕)

编辑:

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

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

您可以测试返回值为NULL且有效的情况,如果不为null,则可以在验证错误消息中返回无效字符。

希望它有所帮助...

答案 1 :(得分:0)

短划线“ - ”必须是右括号[]之间的第一个元素,反斜杠在[]

之间没有特别的含义

答案 2 :(得分:0)


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

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

希望它有所帮助。

答案 3 :(得分:0)

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

此外,如果在字符类中使用斜杠,则无需使用斜杠转义'.',但您的变体不会违反语法。

以下任何正则表达式都会给出您期望的内容:

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