String 在PLSQL中提取URL路径段字符串

String 在PLSQL中提取URL路径段字符串,string,plsql,oracle-sqldeveloper,String,Plsql,Oracle Sqldeveloper,我有一个在一个字段(URL\u field)中包含完整URL的表,我想提取URL的路径段。下面是一个URL示例(表中的一个单元格): 我想要的部分是/pub/data/test/paleocean/deposition\u files/complete/ 到目前为止,我已经: SELECT SUBSTR(URL_FIELD, INSTR(URL_FIELD, '/pub', -1)) AS PATH_NAME FROM EG_VAR_UPLOAD_TEST; 返回 /pub/data/test

我有一个在一个字段(
URL\u field
)中包含完整URL的表,我想提取URL的路径段。下面是一个URL示例(表中的一个单元格):

我想要的部分是
/pub/data/test/paleocean/deposition\u 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
前面的部分也不相同(有时)。

使用
REGEX\u SUBSTR
可以尝试以下操作: 我假设
每个URL只有最后的正斜杠不同,/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> 
regexp的解释:

  • ^http
    与开头的“http”匹配
  • s?
    匹配“https”中的可选“s”
  • ://
    与“http”/“https”后面的“://”匹配
  • [^/]+
    匹配“://”后面的任意数字非“/”字符
  • */
    匹配任意数量以“/”结尾的任意字符,而其周围的括号将其标记为“子表达式#1”
  • [^/]+$
    匹配结尾处的任意数字非“/”字符
然后,
regexp\u substr()
函数的后续参数是:

  • 1
    是“从位置1开始”
  • 1
    是“第一次出现regexp”
  • null
    是“对regexp处理没有修改器”
  • 1
    是“返回子表达式#1”,它指的是在实际regexp中定义的子表达式#1(见上文)

对regexp的解释非常好。非常感谢,谢谢@SamuelLockshin NOAAAffilia,如果您觉得我的答案有用,您可以将其标记为已接受的答案。非常感谢。
  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> 
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;