我需要验证提供的字符串是否只允许使用Oracle正则表达式(REGEXP_LIKE)的字符。 允许的字符是:abcdefghijklmnopqrstuvwxyz0123456789_-。 试图执行
SELECT CASE
WHEN REGEXP_LIKE('abcdefghijklmnopqrstuvwxyz0123456789_-.'
, '^[a-z0-9_\-\.]+$')
THEN 'true'
ELSE 'false'
END tmp
FROM dual;
导致'假'。
有关于此的任何想法吗?
答案 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_\.-]+$'