2

我正在尝试使用 pig 从原始文本中提取电子邮件详细信息。

这是示例数据:

Sample data for email abc.123@gmail.com
Sample data for email xyz@abc.com

我正在尝试使用 REGEX 方法,正则表达式来自:http ://www.mkyong.com/regular-expressions/how-to-validate-email-address-with-regular-expression/

这是脚本:

A = Load '----' using PigStorage as (value: chararray);
B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(value, '^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z]{2,})$')) AS (f1: chararray)
dump B;

将输出转储到终端后,我得到空白输出:

()
()

脚本语法有问题吗?

请分享一些关于正则表达式写作的链接,这将非常有帮助。

感谢您的帮助,谢谢。

4

1 回答 1

2

对于以下输入数据

abc.123@gmail.com
xyz@abc.com

您的代码的输出是

.123 .com
     .com

所以你的代码中有几个问题

  1. 您需要在整个正则表达式周围添加括号以捕获完整的电子邮件地址。如果每一行中只有一个令牌(单词或电子邮件 ID),则该代码应该可以工作

  2. 如果每个输入行都可以是一个句子,那么您必须先进行标记化,然后在标记上进行正则表达式匹配。

您拥有的正则表达式仅适用于令牌而不在线的原因是“^”表示字符串的开头,“$”表示字符串的结尾,因此只有当整行是电子邮件 ID 时,匹配才会成功意味着每行只能有一个令牌。

于 2013-09-12T21:10:33.517 回答