【问题标题】:Perl regex split with new linesPerl 正则表达式用新行拆分
【发布时间】:2010-10-15 01:33:03
【问题描述】:

我是 Perl 的新手,我正在为学校做一个项目,但我卡住了。

输入:一个给定的文本文件,其中包含由空格、制表符、","、";" 分隔的电子邮件地址或“:” [可以在不同的行上]。

我正在尝试读取电子邮件地址并将它们放入一个数组中。我可以在一行上解析数据,但是如果有换行符或返回,我只会得到最后一个元素。

有人可以帮我弄清楚如何将每个地址放在单独的行上并解析它们吗?我已经阅读了一些关于正则表达式的内容,但需要更多的练习。谢谢。

open(EmailAddresses, "EmailAdressesCommaList.txt") || die "Can not open file $!";

# 
while (<EmailAddresses>)
{
    chomp;
    # Split the line into words
    @lines = split /[ ,;:\t\r\n(\t\r\n\s)+?]/;
}

foreach $value (@lines)
{
    print $value . "\n";
}

【问题讨论】:

    标签: regex perl split


    【解决方案1】:
    open(EmailAddresses, "EmailAdressesCommaList.txt") || die "Can not open file $!";
    while(<EmailAddresses>) {
        chomp;
        push @lines, split /[ ,;:\t\r\n(\t\r\n\s)+?]/;
    }
    foreach $value (@lines) {
        print $value . "\n";
    }
    

    即问题不在于您的正则表达式,而在于您每次通过循环都覆盖@lines。

    【讨论】:

    • 我习惯于在我想要的范围内声明变量。在这里,我会输入“my @lines;”在while循环之前。我认为丢失的声明会被“use strict; use warnings;”捕获。
    【解决方案2】:

    正如混乱所指出的,您应该推入数组,而不是覆盖它,但是您的正则表达式也很奇怪。看来你想做:

    /[ ,;:\t\r\n][\t\r\n\s]+/
    

    但是,我认为这也可以:

    /[,;:\s]+/
    

    【讨论】:

    • 是的,这不是有史以来最健康的正则表达式。
    【解决方案3】:

    混沌是正确的。如果您要打开文本文件并在同一个程序中再次处理它,请记住清除数组。

    @lines = ();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多