2012-12-17 31 views
3

我仍然在學習正則表達式,並有很長的路要走,所以將有更多的正則表達式的經驗,從任何人的幫助。我正在研究一個perl腳本來解析多個日誌文件,並解析某些值。在這種情況下,我試圖獲取用戶名的列表。如何使用regex(perl)在特定/靜態字符串之後查找值?

這是我的日誌文件看起來是這樣的:

[date timestamp]UserName = Joe_Smith 
    [date timestamp]IP Address = 10.10.10.10 

..

只是測試,我已經能夠使用\UserName\s\=\s\w+拉出來,但我只是想爲實際用戶名值,不包括'UserName ='部分。理想情況下,如果我能使這個工作,我應該能夠應用相同的邏輯來拉出IP地址等,但只希望得到目前的用戶名單。

此外,用戶名總是在Firstname_Lastname以上的格式,所以我相信\ w +應該總是得到我需要的一切。

感謝任何幫助!

回答

5

你應該捕獲匹配的字符串,你有興趣在正則表達式中使用括號的一部分。

如果匹配成功,然後捕獲是在內置變量$1$2等,在他們的左括號出現在正則表達式的順序編號可用。

在這種情況下,您只需要一次捕獲,因此您只需要看看$1

當心,你應該總是檢查一個正則表達式匹配的捕獲變量使用值之前成功了,因爲他們從最後成功比賽保留值和失敗的匹配不會重置它們。

use strict; 
use warnings; 

my $str = '[date timestamp]UserName = Joe_Smith'; 

if ($str =~ /UserName = (\w+)/) { 
    print $1, "\n"; 
} 

輸出

Joe_Smith 
+0

這工作就像我需要的,偉大的答案 - 謝謝! – Obie

2

另一種方式來做到這一點:

my ($username) = $str =~ /UserName\s\=\s(\w+)/ 
    or warn "no username parsed from '$str'\n"; 
相關問題