2017-05-08 5 views
1

Ich habe eine Tabelle mit vollständigen URLs in einem Feld (URL_FIELD) und ich möchte das Pfadsegment der URL extrahieren. Hier ist ein Beispiel für eine URL (eine Zelle in der Tabelle):Extract URL Pfad Segment Zeichenfolge in PLSQL

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

Der Teil I /pub/data/test/paleocean/sediment_files/complete/ ist wollen.

Bisher habe ich:

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

die zurück

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

so brauche ich das Teil nach dem letzten Schrägstrich (nantuck-tab.txt) zu entfernen. Ich denke, das Verschachteln der aktuellen SUBSTR()-Funktion in eine andere SUBSTR()-Funktion könnte den Trick tun, obwohl ich mit allen verschachtelten Parametern verwirrt werde. Beachten Sie, dass der Abschnitt nach dem letzten Schrägstrich für jede URL variiert. Dies gilt auch für den Abschnitt, der /pub (manchmal) vorausgeht.

Antwort

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; 

Erklärung des regexp:

  • ^http matches "http" zu Beginn
  • s? die optionalen "s" entspricht in "https"
  • :// entspricht die ": //" nach dem "http"/"https"
  • [^/]+ Streichhölzern willkürliches Zahl nicht - "/" Zeichen nach dem ": //",
  • .*/ Matches beliebige Anzahl von beliebigen Zeichen mit "/" enden, während die Klammern um es markieren sie als "subexpression # 1",
  • [^/]+$ Streichhölzer arbitrary passt eine beliebige Zahl nicht - "/" Zeichen am Ende.

Und dann die nachfolgenden Argumente an die regexp_substr() Funktion sind:

  • 1 wird "von der Position 1 starten",
  • 1 ist "erstes Auftreten des regexp nehmen",
  • null ist "keine Modifikatoren für die Regexp-Verarbeitung",
  • 1 ist "den Teilausdruck # 1 zurückgeben", die sich auf den Teilausdruck # 1 definiert ed in der eigentlichen Regexp (siehe oben).
+0

Große Erklärung der Regexp. Sehr geschätzt, danke !! – snl330

+0

@ SamuelLockshin-NOAAAffilia, wenn Sie meine Antwort nützlich finden, können Sie es als akzeptierte Antwort markieren. Vielen Dank. – nop77svk

1

REGEX_SUBSTR Verwenden Sie können wie unten versuchen: Ich gehe davon aus, dass 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; 

siehe Demo:

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

Großartige Beispiele mit einfachem Code, danke !! – snl330