0

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

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

结果为“假”。

对此有什么想法吗?

4

4 回答 4

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有效且不为空的情况,您可以在验证错误消息中返回无效字符。

希望能帮助到你...

于 2012-06-27T08:36:05.300 回答
0


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

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

希望能帮助到你。

于 2012-07-02T07:56:19.103 回答
0

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

于 2012-06-27T08:19:53.557 回答
0

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

当它在字符类中时,也不需要'.'用斜杠转义,但你的变体不违反语法。

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

variant_1 => '^[-a-z0-9_.]+$'
variant_2 => '^[a-z0-9_.-]+$'
variant_3 => '^[a-z0-9_\.-]+$'
于 2015-06-04T05:46:27.990 回答