Regex для преобразования / 01/02/007 / ... в 01/02 и / 01 в 01 / NA - возможно ли это? - PullRequest
3 голосов
/ 31 августа 2010

У меня есть подобный файловой системе (но числовой) путь произвольной длины, который мне нужно канонизировать до фиксированной глубины (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(), которая, по-видимому, препятствует расширенному стандарту POSIX regexp.

То, что я имею до сих пор, это: regexp_replace(path,'/([^/]+(/[^/]+)?).*','\1'); Но у меня проблемы с NA частью.

Ответы [ 2 ]

1 голос
/ 01 сентября 2010

Это похоже на работу:

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 голосов
/ 31 августа 2010

Здесь на самом деле не нужно регулярное выражение, просто используйте substr с instr, например.

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

Вам нужно будет отследить случай, когда в строке нет четвертой косой черты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...