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;
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;