1
create or replace function MyFunction(v_FileName in varchar2)

我想防止在 v_FileName 的第二个字符中使用特殊字符。

这些字符是:

!@#$%^&*()_+=`~[]{}'\|?/><,;:

(我想允许使用。和“)

我已经尝试了几个 regexp_like 表达式,但没有运气。例子:

DECLARE
  vResult NUMBER DEFAULT NULL;
BEGIN    
  select case when regexp_like('d[av inder 1234' ,'^[[:alnum:]]([^[:alnum:]]|\"+|\.+)') then 0 else 1 end into vintResult from dual;
  dbms_output.put_line('result: '||vintResult);
END;

输出:

result: 1

结果应该是 0 因为 char [ 应该是不允许的。

我究竟做错了什么?

4

2 回答 2

1

您缺少第一个字符类周围的冒号[[alnum]]

'^[[:alnum:]]([^[:alnum:]]|\"+|\.+)'

例如

select case when regexp_like('d[av inder 1234',
  '^[[:alnum:]]([^[:alnum:]]|\"+|\.+)')
    then 0 else 1 end as vintResult from dual;

VINTRESULT
----------
         0

或者:

DECLARE
  vintResult NUMBER DEFAULT NULL;
BEGIN    
  select case when regexp_like('d[av inder 1234' ,'^[[:alnum:]]([^[:alnum:]]|\"+|\.+)') then 0 else 1 end into vintResult from dual;
  dbms_output.put_line('result: '||vintResult);
END;
/

PL/SQL procedure successfully completed.

result: 0

如果您允许第一个位置的任何字符,您可以只使用一个点:

'^.([^[:alnum:]]|\"+|\.+)'

...但我怀疑您确实只希望在第一个位置使用字母数字。如果您有要排除的特定字符列表,那么可能会更清楚,特别是对于将来维护它的人来说,列出这些而不是使用第二个字符类 - 如@KevinEsche 的回答。(我不确定您的模式是否与您所说的要禁止的模式完全匹配)。

DECLARE
  vintResult NUMBER DEFAULT NULL;
BEGIN    
  select case when regexp_like('d[av inder 1234' ,'^.[][!@#$%^&*()_+=`~{}''\|?/><,;:].*')
    then 0 else 1 end into vintResult from dual;
  dbms_output.put_line('result: '||vintResult);
END;
/

PL/SQL procedure successfully completed.

result: 0

请注意方括号在字符组中的位置,这些字符已从原始字符串中移出;这是为了防止他们被误解为提前结束小组。

于 2016-01-13T11:13:50.077 回答
1

您也可以像这样简单地使用它。

使用 a[]定义应该匹配的一组字符

select case when regexp_like('d''v inder 1234' ,'^.[][!@#$%^&*()_+=`~{}''\|?/><,;:].*') then 0 else 1 end from dual;
于 2016-01-13T11:18:44.887 回答