plsql oracle防止在字符串的第二个字符中使用特殊字符

plsql oracle prevent the use of special characters in the 2nd char of string

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,因为字符 [ 应该是不允许的。

我做错了什么?

您缺少第一个字符周围的冒号 class、[[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:]]|\"+|\.+)'

...但我怀疑您只想在第一个位置使用字母数字。而且,如果您有要排除的特定字符列表,那么列出这些字符而不是使用第二个字符 class 可能会更清楚,特别是对于将来维护此字符的人 - 正如@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

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

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

使用[]定义一组需要匹配的字符

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