谁能帮我重写这个正则表达式使其成为非指数的?
我正在使用 perl 来解析电子邮件数据。我想从数据中提取电子邮件地址。这是我一直在使用的正则表达式的简化版本:
my $email_address = qr/(?:[^\s@<>,":;\[\]\(\)\\]+?|"[^\"]+?")@/i
为简单起见,我删除了正则表达式后面的域部分。 (它不会造成任何问题。)
这将找到符合 RFC 标准的电子邮件地址,该地址要么包含非电子邮件元字符,要么包含后跟 @ 的“引号”字符串。使用或“|”具有两个不同多字符模式的正则表达式的一部分会产生指数问题。
问题是,当我在几千个字符长的数据行上释放它时。
$ wc line7.txt
1 221 497819 line7.txt
(很抱歉,我现在无法提供输入数据,稍后我也许可以模拟一些。)
就像将 (a*b*)* 重写为 (a|b)* 一样,我需要重写此正则表达式。
将其拆分为两个单独的正则表达式会在代码更改方面产生更多工作,因此我愿意在此时执行。虽然它会解决我的问题。
最终目标机器位于 Hadoop 集群上。所以我想避免 Hadoop 的 perl 版本不附带的 CPAN 模块。 (我得看看Email::Find能不能用。)这是我在工作中遇到的问题。
最佳答案
您是否考虑过 CPAN 模块 Email::Valid和 Email::Find ?
除非这是为了您自己的乐趣或教育,否则您几乎肯定不应该尝试编写自己的电子邮件地址来匹配正则表达式。如果您想知道这样的事情到底是什么样子,请参阅 Jeffrey Friedl 的《精通正则表达式》。 (提示:它有 6,598 字节长。)
关于regex - 指数正则表达式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6380081/