如何在perl正则表达式匹配中排除特定文本

时间:2013-10-10 20:16:06

标签: regex perl

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

E.g。 ---

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两次,但无法找到如何做到这一点。好像它应该很简单!非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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()返回的前两个元素。