2013-10-10 22 views
0

我正在使用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兩次閱讀,但無法找到如何做到這一點。看起來應該很簡單!任何幫助深表感謝。

+0

只是忽略你不想在你的正則表達式中的額外文本:'/(\ w +),(\ w +)/'? –

+0

感謝您的評論,但這不起作用,因爲名稱字段有時具有中間初始,JR,SR等。 – lp1756

回答

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,勞登),並且您可以創建文本的詳盡清單你想排除,而那些永遠不會等於名稱中的單詞。

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

+0

這將起作用。我固執地尋找將所有東西嵌入到一個正則表達式中的解決方案。但有時最好保持簡單並繼續前進!謝謝。 – lp1756

+0

希望正則表達式能夠做所有事情是很常見的。有時候這會讓它變得更加複雜。 – asjo