【问题标题】:In Perl, how can I parse a string that might contain many email addresses to get a list of addresses?在 Perl 中,如何解析可能包含许多电子邮件地址的字符串以获取地址列表?
【发布时间】:2011-05-02 08:28:26
【问题描述】:

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

例如:

$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";

【问题讨论】:

  • 您必须始终启用警告:perl -we '$x = "a@acom":@acom 可能在 -e 第 1 行的字符串中意外插值。

标签: perl parsing email-address


【解决方案1】:
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;";

【讨论】:

  • 可能应该执行类似grep { $_ } split(/[,;]/, $str) 的操作,以防止列表末尾出现空白条目。
  • @mscha:没必要。默认情况下,split 函数会删除空的尾随字段。
  • 今天学到了一些新东西。 :-) 谢谢。
  • +1 用于指出 @ 在双引号字符串中插入。 OP 不得启用警告。
【解决方案2】:

拆分(/[.;]/, $str)

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      通过“;”发送至split或“,”

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

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

      【讨论】:

        【解决方案5】:

        当然,您可以使用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.com - - '测试员,测试' - test@example.com - - C - c@c.com - -d - d@d.com

        【讨论】:

        • 好点,+1。如果您的示例包含类似"Tester, Test" &lt;test@example.com&gt;(许多邮件程序产生)之类的内容,则效果会更好。
        【解决方案6】:

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

        my $str = 'abc@xyz;qwe@rty;';
        
        my @addrs = ($str =~ m/(\w+\@[\w\.]+)/g);
        
        print join("<->", @addrs);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-21
          • 1970-01-01
          • 2011-01-07
          • 1970-01-01
          • 2023-04-03
          • 2013-05-01
          • 2015-05-02
          • 2022-07-14
          相关资源
          最近更新 更多