正则表达式将/ 01/02/007 / ...转换为01/02和/ 01转换为01 / NA - 是否可能?

时间:2010-08-31 13:44:43

标签: regex oracle

我有任意长度的文件系统(但是数字)路径,我需要规范化到固定深度(2或3)。基本上,我想要这个结果:

/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部分的问题。

2 个答案:

答案 0 :(得分: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> 

当然,如果这只是正则表达式中的练习,那么它就不符合您的要求。

答案 1 :(得分:0)

这里实际上并不需要正则表达式,只需使用带有instr的substr,例如

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

你需要捕捉字符串中没有第四个正斜杠的情况。