【发布时间】:2011-09-16 19:53:41
【问题描述】:
有人可以帮我把这个正则表达式改写成非指数的吗?
我正在使用 perl 来解析电子邮件数据。我想从数据中提取电子邮件地址。这是我一直在使用的正则表达式的缩短版本:
my $email_address = qr/(?:[^\s@<>,":;\[\]\(\)\\]+?|"[^\"]+?")@/i
为简单起见,我删除了正则表达式后面的域部分。 (它不会引起任何问题。)
这将找到一个符合 RFC 的电子邮件地址,其中包含非电子邮件元字符或后跟 @ 的“引用”字符串。使用 OR '|'具有两种不同多字符模式的正则表达式的一部分会产生指数问题。
问题是,当我在几千个字符长的数据行上释放它时。
$ wc line7.txt
1 221 497819 line7.txt
(很抱歉,我目前无法提供输入数据,我可能稍后可以模拟一些。)
就像将 (a*b*)* 重写为 (a|b)* 一样,我需要重写这个正则表达式。
将其拆分为两个单独的正则表达式会在代码更改中创建更多工作,然后我愿意在这一点上执行。虽然它会解决我的问题。
最终的目标机器位于 Hadoop 集群上。所以我想避免使用 Hadoop 版本的 perl 不附带的 CPAN 模块。 (我得检查一下是否可以使用Email::Find。)这是我在工作中遇到的问题。
【问题讨论】:
-
去掉不必要的 \ 字符,让你的 RE 更具可读性:qr/(?:[^\s@,":;\[\]()\\]+? |"[^"]+?")@/i