2014-02-20 117 views
1

我要驗證在PL/SQL的IPv6地址。我想出了正則表達式從這裏:Regular Expression (RegEx) for IPv6 Separate from IPv4甲骨文正則表達式(REGEXP_LIKE)太長錯誤 - ORA-12733

我正在一個ORA-12733: regular expression too long錯誤。有沒有辦法解決?

if (REGEXP_LIKE(v,'^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]1{0,1}[0-9]){0,1}[0-9]))$')) then 
    self.success := 1; 
    self.message := null; 
    return; 
else 
    self.success := 0; 
    self.message := 'Invalid IPv6 address. Example of a valid format: 2001:0db8:0000:0000:0000:ff00:0042:8329'; 
    return; 
end if; 

的限制是512https://stackoverflow.com/a/2694119/3112803),我在657。我想不出有什麼辦法來分解它。

正在導入Java類到Oracle的唯一途徑? https://community.oracle.com/thread/1149462?start=0&tstart=0

更新:我想這個,但是當我運行select測試它,它拋出ORA-29531: no method isProperIPv6Address in class ipv6。我之前並沒有在Oracle中與Java搞混,所以我不確定我是否接近或者這是一個糟糕的主意。

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED ipv6 as 
public class ipv6 
{ 
    public static int isProperIPv6Address(String address) 
    { 
     try 
     { 
      java.net.Inet6Address.getByName(address); 
      return 1; 
     } catch(Exception e) { return 0; } 
    } 
} 

create or replace function isProperIPv6Address (string in varchar2) 
return number as language java name 'ipv6.isProperIPv6Address(java.lang.Int) return java.lang.Int'; 

select isProperIPv6Address('blah') from dual; 

但看來java.net.Inet6Address.getByName()將字面上出去上網,看看這個地址確實存在(從https://community.oracle.com/message/8648095拍攝)。我的理解是否正確?我不需要那個。我只需要驗證它們的語法是否有效。

回答

3

有許多短的正則表達式的邏輯或更換您的長正則表達式^regexp1|regexp2|...$
if (REGEXP_LIKE(v,'^regexp1$') OR REGEXP_LIKE(v,'^regexp2$') OR ...) then

UPDATE:

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED ipv6 as 
import java.net.Inet6Address; 
public class ipv6 
... 
create or replace function isProperIPv6Address (string varchar2) return number 
as language java name 'ipv6.isProperIPv6Address(java.lang.String) return int'; 
+0

這只是它,我不知道如何,因爲拆分這件事數字的「塊」可以在IPv6中變化。從我迄今爲止的研究來看,使用java似乎是一種方式。這就是我現在要做的。我更新了這個問題。 – gfrobenius

+0

@gfrobenius - 回答更新。 –

+0

嗯,沒有喜悅,補充缺少的線,掉線Java源代碼,重新編譯,同樣的錯誤。 – gfrobenius