在PCRE中截断要调整大小的字符串

时间:2012-11-23 12:40:18

标签: regex perl pcre

使用单个正则表达式行(这在应用程序的配置文件中)我需要捕获电子邮件地址的本地部分。

如果它仅包含数字,则将其传递给未经修改的数字。 如果它上面有任何非数字字符,则截断为最多11个字符

我制作了这个简单的程序进行测试但是如果localpart超过11个字符就没有匹配(打印整个电子邮件地址)。

#!/usr/bin/env perl

my @emails = ('the-chuck.t1.norrisson@chuck.com', '358451399991@chucksphon.com', 'ph33t@gmail.com', 'the-average.guyisbald@example.com', 'alongnameit@11chars.com', 'alongnameitis@13chars.com', 'a1234567890@11charnum.com');

for my $email (@emails){

    # will put $1$2 on the substituion spot
    $email =~ s/^(\d+)@.+|^([a-zA-Z0-9._%+-]{1,11})@.+/  /;

    print '===> ' . $email  . " \n\n ";

}

我哪里错了?

1 个答案:

答案 0 :(得分:2)

如果字符数超过11,您需要包含\S*?等正则表达式原子...

    $email =~ s/^(\d+)@.+|^([a-zA-Z0-9._%+-]{1,11})\S*?@.+/$1$2/;

使用它可以产生正确的输出:

[mpenning@Bucksnort ~]$ perl sample.pl
===> the-chuck.t

 ===> 358451399991

 ===> ph33t

 ===> the-average

 ===> alongnameit

 ===> alongnameit

 ===> a1234567890

 [mpenning@Bucksnort ~]$
相关问题