2017-05-08 130 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