甲骨文 REGEXP_SUBSTR 斯普利特 URL

Oracle REGEXP_SUBSTR Split URL

我没有太多地使用正则表达式,但是,我想将 URL 分解成 URL 的不同部分:即 SCHEME(http 或 https), IP_ADRESS(1.1.1.1 或主机名,例如 dummy.org)、PORT(实际上可以是任意长度),最后是 CONTEXT

正如您在下面所看到的,这是我迄今为止设法实现的目标,可能不是最好的方法:)。但是,目前我唯一的挣扎是,如果 IP 地址是数字,我已经满足了,但我也想满足它是主机名的情况。你如何满足第二个 / 和第一个之间的任何事情:? 最后,我也很难理解上下文,我似乎无法理解第二部分。我需要从第三个/到最后的任何值

*SELECT 
    REGEXP_SUBSTR(url, '^https?*') AS "SCHEME",
    REGEXP_SUBSTR(url, '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\') AS "IP_ADDRESS",
    REGEXP_REPLACE(REGEXP_SUBSTR(url, '[0-9]+\.*/'),'[/]', '') AS "PORT",
    REGEXP_SUBSTR(url, '^https?://[^/]+(.*/)[^/].*', 1, 1, null, 1) AS "CONTEXT"
from (
     select 'https://1.2.3.4:80801/test/test2' as url from dual
    );*
SCHEME IP_ADDRESS PORT CONTEXT
https 1.2.3.4 80801 /test/

提前感谢您的帮助:)

试试这个:

SELECT url,
    REGEXP_SUBSTR(url, '^([^:]*)://',1,1,null,1) AS "SCHEME",
    REGEXP_SUBSTR(url, '^([^:]*://)?([^/:]+)(:|/|$)',1,1,null,2) AS "HOST",
    REGEXP_substr(url, '^([^:]*://)?([^/:]+):(\d+)',1,1,null,3) AS "PORT",
    REGEXP_SUBSTR(url, '^([^:]*://)?([^/]+)(/.*)?', 1, 1, null, 3) AS "CONTEXT"
from (
     select 'https://1.2.3.4:80801/test/test2' as url from dual
     union all select 'https://example.com:80801/test/test2' as url from dual
     union all select 'https://example.com/test/test2' as url from dual
     union all select 'http://example.com:8080/test/test2' as url from dual
     union all select 'http://example.com/' as url from dual
     union all select 'http://example.com' as url from dual
     union all select 'http://example.com:888' as url from dual
     union all select 'http://www.example.com' as url from dual
     union all select 'ftp://example.com/test/test2' as url from dual
     union all select 'skype://username' as url from dual
    );

结果:

URL                                  SCHEME HOST                 PORT     CONTEXT
------------------------------------ ------ -------------------- -------- --------------------
https://1.2.3.4:80801/test/test2     https  1.2.3.4              80801    /test/test2
https://example.com:80801/test/test2 https  example.com          80801    /test/test2
https://example.com/test/test2       https  example.com                   /test/test2
http://example.com:8080/test/test2   http   example.com          8080     /test/test2
http://example.com/                  http   example.com                   /
http://example.com                   http   example.com
http://example.com:888               http   example.com          888
http://www.example.com               http   www.example.com
ftp://example.com/test/test2         ftp    example.com                   /test/test2
skype://username                     skype  username