指数正则表达式问题

CIA*_*uck 2 regex email perl parsing

有人可以帮我改写这个正则表达式是非指数的吗?

我正在使用perl来解析电子邮件数据.我想从数据中提取电子邮件地址.这是我一直在使用的正则表达式的缩短版本:

my $email_address = qr/(?:[^\s@<>,":;\[\]\(\)\\]+?|"[^\"]+?")@/i

为简单起见,我删除了正则表达式的后一个域部分.(这不会造成任何问题.)

这将找到符合RFC的电子邮件地址,该地址包含非电子邮件元字符或"引用"字符串,后跟@.使用OR'|' 具有两种不同多字符模式的正则表达式的一部分会产生指数问题.

问题是,当我在一行长达数千个字符的数据线上释放它时.

$ wc line7.txt 
1    221 497819 line7.txt
Run Code Online (Sandbox Code Playgroud)

(对不起,我现在无法提供输入数据,我可能稍后会嘲笑一些.)

就像重写(a*b*)*到(a | b)*一样,我需要重写这个正则表达式.

将它拆分为两个独立的正则表达式可以在代码更改中创建更多工作,然后我愿意在这一点上执行.虽然它会解决我的问题.

最终目标计算机位于Hadoop集群上.所以我想避免使用没有Hadoop版本的perl的CPAN模块.(我必须检查是否甚至可以使用Email :: Find.)这是我在工作中遇到的问题.

Bri*_*ard 7

您是否考虑过CPAN模块Email :: Valid and Email :: Find

除非这是为了您自己的乐趣或教育,否则您几乎肯定不应该尝试编写与正则表达式匹配的自己的电子邮件地址.如果您想知道这样的事情究竟是什么样子,请参阅Jeffrey Friedl掌握正则表达式.(提示:长度为6,598字节.)