我可以请求您的帮助,以便使用REGEXP_EXTRACT
构建一个在Google Big Query上使用的正则表达式,它将解析给定输入网址的完整域名吗?
解析条件:
//
:在第一次发生//
之后
如果没有//
:从字符串的开头?
或第一个/
或第一个&
之后或直到字符串的结尾如果没有找到?
,/
或&
一些例子:
htp://www.google.com --> www.google.com
htp://www.google.com/item/ --> www.google.com
htp://www.google.com?source=google --> www.google.com
htp://www.google.com&source=google --> www.google.com
www.google.com --> www.google.com
www.google.com/item/ --> www.google.com
www.google.com?source=google --> www.google.com
www.google.com&source=google --> www.google.com
http://google.com&source=google --> google.com
https://www.example-code.com/vb/string.asp --> www.example-code.com
我创建了这个REGEX:
REGEXP_EXTRACT('google.it?medium=cpc?cobranded=google&keyword=foo';, r'//([^/|^?|^&]+)')
但它只适用于包含//
的网址,我不能得到一个有效的正则表达式,如果没有//
在网址中。
只是为了证明这个问题有BigQuery Tag(而不仅仅是正则表达式) - 请考虑以下选项
BigQuery Legacy SQL支持URL Functions集 以下是您案例中的使用示例
SELECT
url,
HOST(REPLACE(CASE WHEN url CONTAINS '//' THEN url ELSE 'http://' + url END, '&', '?')) AS output
FROM
(SELECT 'http://www.google.com' AS url),
(SELECT 'htp://www.google.com/item/' AS url),
(SELECT 'htp://www.google.com?source=google' AS url),
(SELECT 'htp://www.google.com&source=google' AS url),
(SELECT 'www.google.com' AS url),
(SELECT 'www.google.com/item/' AS url),
(SELECT 'www.google.com?source=google' AS url),
(SELECT 'www.google.com&source=google' AS url),
(SELECT 'http://google.com&source=google' AS url)
'//([^/|^?|^&]+)'
用'//'=>结果开始你的正则表达式需要以'//'开头
你可以做到这一点
'(?://)([^/|^?|^&]+)'
使用'()'我创建一个匹配组但使用?:这个匹配组不会出现在结果中
这会有用吗?
/b[\w.-]+(?:com|edu)
仅适用于'.com'和'edu'地址,但也许可以进一步修改。
**** ****更新
忍不住玩它。这是将域分组到捕获组的一个:
([\w.-]++(?!:)).*+
需要支持前瞻,并假设每个网址之间有换行符。
基本上它会找到任何一系列字母,数字,句号或短划线后面没有冒号。
冒号是为了防止它找到http:
'。* +'将消耗该行的其余部分,因此在第一次分组后它不会继续找到匹配项。
BigQuery提供以下三个功能:
HOST() - 给定一个URL,将主机名作为字符串返回。
DOMAIN() - 给定一个URL,将域作为字符串返回。
TLD() - 给定一个URL,返回顶级域名和URL中的任何国家域名。