您缺少第一个字符类周围的冒号[[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
请注意方括号在字符组中的位置,这些字符已从原始字符串中移出;这是为了防止他们被误解为提前结束小组。