提取原始电子邮件并删除电子邮件中的电子邮件别名

Extracting original email and remove email alias in emails

我正在尝试从别名获取主要电子邮件,例如,我有以下示例,我需要对其进行规范化。

  1. 从“test.me@email.com”到“testme@email.com”
  2. 从“test+me11@email.com”到“test@email.com”
  3. 从“test.me.123+22@email.com”到“testme123@email.com”
  4. 从“test+123@email.com”到“test@email.com”

我在 bigquery 上写了一个 SQL 语句,但收到一条错误消息“SUBSTR() 中的第三个参数不能为负数”

SELECT  TRANSLATE(SUBSTR('test+123@email.com', 1, INSTR('test+123@email.com', '+')-1),'+.', '') ||'@' || SUBSTR('test+123@email.com', Instr('test+123@email.com','@')+1)

关于上述内容的任何想法或建议,或使用 regex_replace 的想法

谢谢

您似乎试图通过注释 (``) 来替换 +. 字符:

TRANSLATE(SUBSTR('test+123@email.com', 1, INSTR('test+123@email.com', '+')-1),'+.', '')

这不起作用,因为使用 TRANSLATE() 的第二个和第三个参数的长度应该相等。

也许你想做(@之前的部分):

REPLACE(REPLACE(LEFT('test+123@email.com',INSTR('test+123@email.com','@')-1),'+',''),'.','')

也许你可以试试正则表达式,但我不确定性能是好是坏。

select CONCAT(REGEXP_EXTRACT("test.me+123@email.com", r'([\w\.]+)'), REGEXP_EXTRACT("test.me+123@email.com", r'(@[\w\.]+)'))

考虑以下方法

select email, 
  regexp_replace(email, r'([^+@]+)+?([^@]*(.*))', r'') original_email
from your_table             

如果应用于您问题中的示例数据 - 输出为

如果出于某种原因您想要删除点 - 请使用下面的内容

select email, original_email,
  format('%s@%s', 
    replace(split(original_email, '@')[offset(0)], '.', ''), 
    split(original_email, '@')[offset(1)]
  ) with_stripped_dots
from your_table, 
unnest([regexp_replace(email, r'([^+@]+)+?([^@]*(.*))', r'')]) original_email             

有输出