使用Perl正则表达式拆分带有换行符的文本

3

我是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";
}
3个回答

7
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。

1
我有一个习惯,就是在我想要的范围内声明变量。在这里,我会在 while 循环之前放置 "my @lines;"。我认为缺少的声明会被 "use strict; use warnings;" 捕获。 - Svante

1
正如chaos所指出的那样,你应该将数据推入数组中,而不是覆盖它,但是你的正则表达式也很奇怪。看起来你想要做的是:
/[ ,;:\t\r\n][\t\r\n\s]+/

不过,我认为这也可以起作用:

/[,;:\s]+/

是的,这不是最健康的正则表达式。 - chaos

1

Chaos 是正确的。如果你要在同一个程序中打开文本文件并再次处理它,请记得清空数组。

@lines = ();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接