在Perl中,如何解析可能包含许多电子邮件地址的字符串以获取地址列表?

时间:2010-10-29 10:44:33

标签: perl parsing email-address

如果字符串包含;,,我想拆分它。

例如:

$str = "a@a.com;b@b.com,c@c.com;d@d.com;";

预期结果是:

result[0]="a@a.com";
result[1]="b@b.com";
result[2]="c@c.com";
result[3]="d@d.com";

6 个答案:

答案 0 :(得分:11)

当然,您可以使用其他人显示的split。但是,如果$str包含完整的电子邮件地址,那么您将处于一个受伤的世界。

相反,请使用Email::Address

#!/usr/bin/perl

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

print Dump [ map [$_->name, $_->address ],
    Email::Address->parse(
        q{a@a.com;"Tester, Test" <test@example.com>,c@c.com;d@d.com}
    )
];

输出:

---
-
  - a
  - a@a.com
-
  - 'Tester, Test'
  - test@example.com
-
  - c
  - c@c.com
-
  - d
  - d@d.com

答案 1 :(得分:6)

my $str = 'a@a.com;b@b.com,c@c.com;d@d.com;';
my @result = split /[,;]/, $str;

请注意,您无法使用双引号分配$str,因为@很特殊。这就是我用单引号替换字符串分隔符的原因。你也可以这样逃避它们:

my $str = "a\@a.com;b\@b.com,c\@c.com;d\@d.com;";

答案 2 :(得分:1)

split(/[.;]/, $ str)

答案 3 :(得分:0)

你也可以使用Text :: Csv并使用“;”或“,”用于分裂。它也有助于查看其他内容,如可打印字符等。

答案 4 :(得分:0)

通过“;”到split或“,”

$test = "abc;def,hij";
@result = split(/[;,]/, $test);

正则表达式意味着匹配转义;或者,性格。 最终结果是@result = ['abc','def','hij']

答案 5 :(得分:0)

回答邮件标题中的问题(与文字略有不同):

my $str = 'abc@xyz;qwe@rty;';

my @addrs = ($str =~ m/(\w+\@[\w\.]+)/g);

print join("<->", @addrs);