查找具有不同结尾的子串
Finding Substring with Different Ending
我正在尝试查找 URL 列表的子字符串,但由于其中一个 URL 末尾的额外字符(正斜杠)而遇到问题。以下是两个数据示例:
我想获取 URL 的最后一个字符串——在本例中为 test
和 test2
。但是,我当前的 REGEX_SUBSTR
只给我第一个 URL 的子字符串,第二个 URL 的子字符串为空,因为第二个 URL 有一个正斜杠。
如何创建查询,使其 returns 同时 test
和 test2
?
我的 REGEXP_SUBSTR
查询示例:
REGEXP_SUBSTR(URL, '/([^/]+)$', 1, 1, 'e', 1) as URL_EXTRACT
您可以为此任务使用 Positive Lookahead:
[^\/\n]+(?=\/?$)
解释:
[^\/\n]+
: 除斜杠和换行符之外的任意字符组合(您的匹配项)
(?=\/?$)
:正面前瞻(检查你的比赛之后是否有)
\/?
: 可选斜杠
$
: 结束字符串
试试看 here.
使用PARSE_URL:
Returns a JSON object consisting of all the components (fragment, host, path, port, query, scheme) in a valid input URL/URI.
WITH cte AS (
SELECT CONCAT('http://', COLUMN1) AS URL
FROM VALUES ('www.url1.com/test'),
('www.url1.com/test2/'),
('www.url1.com/test/sub_test/')
)
SELECT URL,
PARSE_URL(URL) AS parts,
PARSE_URL(URL):path::text AS path,
TRIM(PARSE_URL(URL):path::text, '/') AS path
FROM cte;
输出:
编辑:
How would you get just "sub_test" for the last example you have there?
SPLIT_PART
可以使用负索引:
WITH cte AS (
SELECT CONCAT('http://', COLUMN1) AS URL
FROM VALUES ('www.url1.com/test'),
('www.url1.com/test2/'),
('www.url1.com/test/sub_test/')
)
SELECT URL,
PARSE_URL(URL) AS parts,
PARSE_URL(URL):path::text AS path,
SPLIT_PART(TRIM(PARSE_URL(URL):path::text, '/'), '/', -1) AS path3
FROM cte;
输出:
你可以像这样 trim 关闭最后一个斜杠:
select REGEXP_SUBSTR(trim(URL, '/'), '/([^/]+)$', 1, 1, 'e', 1) as URL_EXTRACT
如 Lukasz 所示,将 URL 解析为 JSON 将涵盖更多可能性,但如果这是唯一需要纠正的问题,这对于大型数据集会更快。
我正在尝试查找 URL 列表的子字符串,但由于其中一个 URL 末尾的额外字符(正斜杠)而遇到问题。以下是两个数据示例:
我想获取 URL 的最后一个字符串——在本例中为 test
和 test2
。但是,我当前的 REGEX_SUBSTR
只给我第一个 URL 的子字符串,第二个 URL 的子字符串为空,因为第二个 URL 有一个正斜杠。
如何创建查询,使其 returns 同时 test
和 test2
?
我的 REGEXP_SUBSTR
查询示例:
REGEXP_SUBSTR(URL, '/([^/]+)$', 1, 1, 'e', 1) as URL_EXTRACT
您可以为此任务使用 Positive Lookahead:
[^\/\n]+(?=\/?$)
解释:
[^\/\n]+
: 除斜杠和换行符之外的任意字符组合(您的匹配项)(?=\/?$)
:正面前瞻(检查你的比赛之后是否有)\/?
: 可选斜杠$
: 结束字符串
试试看 here.
使用PARSE_URL:
Returns a JSON object consisting of all the components (fragment, host, path, port, query, scheme) in a valid input URL/URI.
WITH cte AS (
SELECT CONCAT('http://', COLUMN1) AS URL
FROM VALUES ('www.url1.com/test'),
('www.url1.com/test2/'),
('www.url1.com/test/sub_test/')
)
SELECT URL,
PARSE_URL(URL) AS parts,
PARSE_URL(URL):path::text AS path,
TRIM(PARSE_URL(URL):path::text, '/') AS path
FROM cte;
输出:
编辑:
How would you get just "sub_test" for the last example you have there?
SPLIT_PART
可以使用负索引:
WITH cte AS (
SELECT CONCAT('http://', COLUMN1) AS URL
FROM VALUES ('www.url1.com/test'),
('www.url1.com/test2/'),
('www.url1.com/test/sub_test/')
)
SELECT URL,
PARSE_URL(URL) AS parts,
PARSE_URL(URL):path::text AS path,
SPLIT_PART(TRIM(PARSE_URL(URL):path::text, '/'), '/', -1) AS path3
FROM cte;
输出:
你可以像这样 trim 关闭最后一个斜杠:
select REGEXP_SUBSTR(trim(URL, '/'), '/([^/]+)$', 1, 1, 'e', 1) as URL_EXTRACT
如 Lukasz 所示,将 URL 解析为 JSON 将涵盖更多可能性,但如果这是唯一需要纠正的问题,这对于大型数据集会更快。