0

我正在使用 perl 来解析一个大的报告文件。我通过在报告某些行的开头查找姓氏和名字来提取姓名。我正在尝试排除名称后面的文本。其中一些文本字段是数字,因此很容易——我只是寻找非数字字符。但有些是我可以列出的固定文本字段。

例如——

LastNameA, FirstNameA
LastNameB, FirstNameB 345C
LastNameC, FirstNameC BADTEXT
LastNameD, FirstNameD MOREBADTEXT

我试过以下

/^(\D*)((BADTEXT|MOREBADTEXT|))/
/^(\D*)(BADTEXT|MOREBADTEXT|)/
/^(\D*?)((BADTEXT|MOREBADTEXT|))/
/^(\D*)((BADTEXT|MOREBADTEXT)?)/
/^(\D*)(?:(BADTEXT|MOREBADTEXT|))/

和其他几种组合。但是我要么不匹配,要么匹配 BADTEXT 或 MOREBADTEXT 被吸入 $1 而不是 $2。我要么想要 $2 中的错误文本,要么根本不匹配。

请注意,我不想附加到名称的文本将是一个非常小的已知文本字符串列表之一,因此我可以将它们添加到条件组中。

我已通读 perlretut 两次,但找不到如何执行此操作。看起来应该很简单!任何帮助深表感谢。

4

1 回答 1

1

如何在空白处拆分文本并仅保留您喜欢的部分?

#!/usr/bin/perl

use strict;
use warnings;

while (my $line=<DATA>) {
    my @name=grep { ! /\d|^BADTEXT$|^MOREBADTEXT$/ } split /\s+/, $line;
    print "@name\n";
}

__DATA__
LastNameA, FirstNameA
LastNameB, FirstNameB 345C
LastNameC, FirstNameC BADTEXT
LastNameD, FirstNameD MOREBADTEXT

结果:

LastNameA, FirstNameA
LastNameB, FirstNameB
LastNameC, FirstNameC
LastNameD, FirstNameD

这当然意味着您需要知道名称中没有数字(没有 Wainright 3,Loudon),并且您可以创建要排除的文本的详尽列表,并且这些文本永远不等于名称中的单词。

如果你知道只有一个姓氏和一个名字,你可以抓住 split() 返回的前两个元素。

于 2013-10-10T20:31:36.203 回答