如何在某个字符前限制匹配长度?

Ste*_*e F 2 regex perl

我使用以下正则表达式扫描输入文本文件以获取有效的电子邮件.

[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])?
Run Code Online (Sandbox Code Playgroud)

现在我还需要在电子邮件地址中的"@"符号前将匹配限制为20个字符,但不知道如何操作.

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

你能帮帮我吗?

Mar*_*der 5

由于您的库应该与PERL兼容,因此它应该支持前瞻.这些方便了以确保模式中的几个"正交"限制:

(?=[^@]{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])?
Run Code Online (Sandbox Code Playgroud)

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