我正在尝试在电子邮件address列中找到顶级域的长度。
我尝试了Regexp_replace的一些迭代,但没有成功。
失败的尝试都围绕以下命令:
length(regexp_replace(emailaddress,'@.(.*)',1)) --counts before '@' characters
预期输出:
emailaddress = asdfasdf@gmail.com
length = 3
emailaddress = asdfasdf@gmail.co
length = 2
您可以使用
length(regexp_extract(emailaddress,'[.]([^.]+)$', 1))
[.]([^.]+)$
REGEX将匹配一个点,然后将1个或更多的字符捕获到输入末端的点以外的其他字符。1
参数将使regexp_extract
函数仅返回第1组中捕获的子字符串,而length
将返回该值的长度。
,如果您可能在主机部件中没有dot的电子邮件,则可以进一步限制模式(以禁止在否定字符类中匹配@
):
length(regexp_extract(emailaddress,'[.]([^@.]+)$', 1))
另一种方法。使用reverse
,split
的'.'
,采用第一个数组元素,计算长度:
select length(split(reverse(emailaddress),'\.')[0]);
regexp_extract
也可以正常工作。测试这两种方法:
with data as (
select stack (2,
'asdfasdf@gmail.com',
'asdfasdf@gmail.co'
) as emailaddress
)
select emailaddress,
length(split(reverse(emailaddress),'\.')[0]) length_method_1,
length(regexp_extract(emailaddress, '\.(.+)$',1)) length_method_2
from data;
结果:
OK
emailaddress length_method_1 length_method_2
asdfasdf@gmail.com 3 3
asdfasdf@gmail.co 2 2
Time taken: 6.253 seconds, Fetched: 2 row(s)