2016-01-13 64 views
1
create or replace function MyFunction(v_FileName in varchar2) 

我想阻止在v_FileName的第二个字符中使用特殊字符。 !plsql oracle防止在字符串的第二个字符中使用特殊字符

这些字符是:

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

(我想允许。使用和“)

我试过几个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 [应该是不允许的。

我在做什么错?

回答

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' ,'^.[][[email protected]#$%^&*()_+=`~{}''\|?/><,;:].*') 
    then 0 else 1 end into vintResult from dual; 
    dbms_output.put_line('result: '||vintResult); 
END; 
/

PL/SQL procedure successfully completed. 

result: 0 

请注意将方括号放置在已从原始字符串移出的字符组中;这是为了防止他们被误解为早日结束团队。

+0

editted的coluns中。 我确实有他们在我的代码,但忘了把它们写在这里。尽管如此, 仍然没有工作。 我如何使用一个字符列表来禁止?我应该使用什么样的模式? –

+0

@DrorCohen - 您的代码按照预期的方式与列一起运行(无论如何,固定了变量名称声明)。所以不知道你在做什么不同。 –

+0

我测试了你建议的模式“^ [[:alnum:]]([^ [:alnum:]] | \”+ | \。+)'“ 当把char从[改变为'我仍然得到结果:0,但它应该是1因为'是允许的 –

1

你也可以简单地使用它。

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

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

这个deo也没有工作 –