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 が $2 の代わりに $1 に吸い込まれます。$2 に悪いテキストが必要か、まったく一致しないかのどちらかです。

名前に追加したくないテキストは、既知のテキスト文字列の非常に小さなリストの 1 つになるため、それらを条件付きグループに追加できることに注意してください。

perlretut を 2 回読んだことがありますが、これを行う方法が見つかりません。それは単純であるべきだと思われます!どんな助けでも大歓迎です。

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 はありません)、除外したいテキストの完全なリストを作成できること、およびそれらが名前の単語と決して等しくないことを知る必要があることを意味します。

姓と名が 1 つずつあることがわかっている場合は、split() が返す最初の 2 つの要素を取得するだけです。

于 2013-10-10T20:31:36.203 に答える