代码之家  ›  专栏  ›  技术社区  ›  Michael Borgwardt

正则表达式将/01/02/007/…转换为01/02,并将/01转换为01/NA-有可能吗?

  •  3
  • Michael Borgwardt  · 技术社区  · 14 年前

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

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

    我想用甲骨文的 regexp_replace() apparently impelements 扩展的POSIX regexp标准。

    regexp_replace(path,'/([^/]+(/[^/]+)?).*','\1'); 但我在这个问题上遇到了麻烦 NA

    2 回复  |  直到 14 年前
        1
  •  1
  •   DCookie    14 年前

    这似乎奏效了:

    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> 
    

    当然,如果这只是一个正则表达式的练习,那么它就不能满足您的要求。

        2
  •  0
  •   a'r    14 年前

    实际上,这里不需要正则表达式,只需将substr与instr一起使用即可。

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

    您需要了解字符串中没有第四个正斜杠的情况。