2

我正在使用以下正则表达式来扫描输入文本文件中的有效电子邮件。

[A-Za-z0-9!#$%&*+/=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&*+/=?^_`{|}~-]+)*@(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\.)+[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?

现在我还需要在电子邮件地址中的“@”符号之前将匹配限制为 20 个字符,但不知道该怎么做。

PS。我正在使用 Delphi XE2 中的 Perl 正则表达式库 (TPerlRegex)。

请问你能帮我吗?

4

2 回答 2

5

由于您的库应该与 PERL 兼容,因此它应该支持lookaheads。这些可以方便地确保模式中的几个“正交”限制:

(?=[^@]{1,20}@)[A-Za-z0-9!#$%&*+/=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&*+/=?^_`{|}~-]+)*@(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\.)+[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?

@只有在不超过 20 个非@字符之后,前瞻才会匹配。但是,前瞻实际上并没有提前正则表达式引擎在主题字符串中的位置,因此在检查条件后,引擎仍位于电子邮件的开头(或目前正在检查的任何位置)并且将像以前一样继续您的模式。

于 2013-04-21T23:25:18.023 回答
2

考虑使用Email::Address来捕获电子邮件地址,然后ping 那些在:grep之前有 20 个或更少字符的结果@

use strict;
use warnings;
use Email::Address;

my @addresses;

while ( my $line = <DATA> ) {
    push @addresses, $_
      for grep { /([^@]+)/ and length $1 < 21 }
      Email::Address->parse($line);
}

print "$_\n" for @addresses;

__DATA__
ABCDEFGHIJKLMNOPQRSTUVWXYZguest@host.com frank@email.net Line noise. test@host.com
Some stuff here... help@perl.org And even more here!
Nothing to see here.  01234567890123456789@numbers.com  Nothing to see.

输出:

frank@email.net
test@host.com
help@perl.org
01234567890123456789@numbers.com
于 2013-04-22T00:25:48.697 回答