2017-05-08 47 views
1

我有一個表中的完整URL在一個字段(URL_FIELD),我想提取URL的路徑段。這裏是一個URL(表中的一個單元格)的例子:在PLSQL中提取URL路徑段字符串

https://www1.ncdc.noaa.gov/pub/data/test/paleocean/sediment_files/complete/nantuck-tab.txt 

我想要的部分是/pub/data/test/paleocean/sediment_files/complete/

到目前爲止,我有:

SELECT SUBSTR(URL_FIELD, INSTR(URL_FIELD, '/pub', -1)) AS PATH_NAME FROM EG_VAR_UPLOAD_TEST; 

返回

/pub/data/test/paleocean/sediment_files/complete/nantuck-tab.txt 

,所以我需要最終的正斜槓(nantuck-tab.txt)後刪除的部分。我認爲將當前的SUBSTR()函數嵌套到另一個SUBSTR()函數中可能會有效,儘管我一直對所有嵌套參數感到困惑。請記住最後一個正斜槓後面的部分對於每個URL都有所不同,因此/pub(有時)部分也是如此。

回答

1
select regexp_substr('https://www1.ncdc.noaa.gov/pub/data/test/paleocean/sediment_files/complete/nantuck-tab.txt', '^https?://[^/]+(.*/)[^/]+$', 1, 1, null, 1) 
from dual; 

正則表達式的說明:

  • ^http個匹配 「HTTP」 在開始
  • s?匹配可選的 「S」 「https」 中,
  • ://匹配 「://」 之後的 「HTTP」/ 「HTTPS」,
  • [^/]+任意匹配一些非 - 後「/」字符「://」,以「/」結尾的任意字符,
  • .*/匹配任意數,而它周圍的括號標記爲「子表達式#1」,
  • [^/]+$比賽任意匹配任意數字的非「/」字符末尾。

然後,後續的參數傳遞給regexp_substr()功能是:

  • 1是 「從位置1開始」,
  • 1是 「取正則表達式的第一occurence」
  • null是「沒有修飾符到正則表達式處理」,
  • 1是「return the subexpression#1」,它引用了子表達式#1 defin在實際的正則表達式中編輯(見上文)。
+0

正則表達式的很好的解釋。非常感謝,謝謝! – snl330

+0

@ SamuelLockshin-NOAAAffilia,如果您發現我的回答有用,您可以將其標記爲已接受的答案。謝謝。 – nop77svk

1

使用REGEX_SUBSTR可以如下嘗試: 我認爲only final forward slash varies for each URL and so does the section preceding /pub

SELECT REGEXP_SUBSTR (URL_FIELD, '/pub.*/') AS PATH_NAME 
     FROM EG_VAR_UPLOAD_TEST; 

看到演示:

SQL> SELECT REGEXP_SUBSTR (
         'https://www1.ncdc.noaa.gov/pub/data/test/palaeocean/sedimeant_files/complete/nantuck-tab.txt' 
         ,'/pub.*/') 
         AS PATH_NAME 
       FROM DUAL  
    /

    PATH_NAME 
    -------------------------------------------------- 
    /pub/data/test/palaeocean/sedimeant_files/complete 

    SQL> SELECT REGEXP_SUBSTR (
         'https://www1.ncdc.noaa.gov/pub/datttta/test/palaeocean/sedimeant_files/complete/nanttttuck-tab.txt' 
         ,'/pub.*/') 
         AS PATH_NAME 
       FROM DUAL  
     /

    PATH_NAME 
    ----------------------------------------------------- 
    /pub/datttta/test/palaeocean/sedimeant_files/complete 

    SQL> 
+0

簡單代碼的好例子,謝謝! – snl330