2016-01-13 65 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也沒有工作 –