2010-08-31 30 views
3

我有需要規範化到固定深度(2或3)的任意長度的類似文件系統(但數字)的路徑。基本上,我想這樣的結果:正則表達式將/ 01/02/007/...轉換爲01/02和/ 01轉換成01/NA - 可以嗎?

/01/02/007/008 -> 01/02/007 
/01/02/007  -> 01/02/007 
/01/02   -> 01/02/NA 
/01    -> 01/NA/NA 

我想用Oracle的regexp_replace()功能,apparently impelements擴展POSIX正則表達式標準去做。

我到目前爲止是這樣的:regexp_replace(path,'/([^/]+(/[^/]+)?).*','\1'); 但我在NA部分有問題。

回答

1

這似乎工作:

SQL> WITH q AS (
SELECT '/01/02/007/008/009' a FROM dual 
UNION 
SELECT '/01/02/007/008' FROM dual 
UNION 
SELECT '/01/02/007' FROM dual 
UNION 
SELECT '/01/02' FROM dual 
UNION 
SELECT '/01' FROM dual) 
SELECT a, CASE WHEN INSTR(a,'/',1,4) > 0 THEN SUBSTR(a,2,INSTR(a,'/',1,4)-2) 
       WHEN INSTR(a,'/',1,3) > 0 THEN SUBSTR(a,2) 
       WHEN INSTR(a,'/',1,2) > 0 THEN SUBSTR(a,2)||'/NA' 
       ELSE SUBSTR(a,2)||'/NA/NA' 
      END RESULT 
    FROM q;   

A     RESULT 
--------------  ------------------- 
/01    01/NA/NA 
/01/02    01/02/NA 
/01/02/007   01/02/007 
/01/02/007/008  01/02/007 
/01/02/007/008/009 01/02/007 

SQL> 

當然,如果這僅僅是在正則表達式的鍛鍊,那麼它不符合你的要求。

0

你實際上並不需要一個正則表達式,只需在instr中使用substr,例如。

SUBSTR(path, 0, instr(path, '/', 1, 4)-1) 

您需要了解字符串中沒有第四個正斜槓的情況。

相關問題