甲骨文 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
我没有太多地使用正则表达式,但是,我想将 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