2012-06-05 63 views
-2

我的工作需要一定的字符串輸出匹配項目..正則表達式匹配一些字符串

這裏的樣本:

user code timestamp     Action Name     S#TPLC Field Name User code group profile    
SNGLASK  2012-05-30-20.33.53.003000 Insert User     I     TEST5  DISPLAY 
SNGLASK  2012-05-23-22.06.44.422000 Change Password RSO part U  LERAPR  SNGCHIS  FULL_AUTH 
SNGLASK  2012-05-30-20.34.39.066000 Insert User Group Profil I        *NONE 

基本上我有需要了解每一款應用程序行之後的空間屬於下一列。 然後,在動作名稱之後,一切都可以視爲其他。 因此,我已經出來了象下面這樣的正則表達式格式:

REGEX = ^([^\s]+)\s+([^\s]+)\s+([^\s]+)s(.*)$ 
FORMAT = userCode::"$1" TimeStamp::"$2" ActionName::"$3" Others::"$4" 

的策略是識別字符串,則忽略之後的空間。但是,這個東西一直工作到動作名稱,因爲它們可能是動作名稱之間的空格。 因此,我的問題是,如何使用正則表達式讓它識別操作名稱中的字符串,就像我需要「插入用戶」作爲輸入&「更改密碼RSO部分」一樣作爲另一個輸入。

+1

是這個perl?無論您的語言如何,最好在您的問題中添加適當的語言標籤。 – Bohemian

+0

嗨,感謝您的通知,不是perl ..是一個名爲splunk的應用程序中的配置文件。然而,我的問題是如何使用正則表達式來了解幾個字符串(用空格)作爲輸入 – cheeseng

回答

1

做多的話是這樣的:

((\S+\s)+) 

它說一個或多個單詞,用一個空格隔開。 所以正則表達式應該是:

^((\S+\s)+)\s+(\S+)\s+((\S+\s)+)\s+(.*)$ 
+0

謝謝!它工作..但是,我對代碼 ^([^ \ s] +)\ s +([^ \ s] +)\ s +((\ S + \ s)+)\ s +(。* )$ 因爲我只需要1個動作名稱空間其他仍然相同。 無論如何,感謝您的幫助。 – cheeseng

+0

嗨@Sahand Mozaffari,對不起,再次麻煩你。在我嘗試實現你之後,我發現的代碼仍然有一點不匹配。請參閱我的源數據以瞭解以下問題:) REGEX = ^([^ \ s] +)\ s +([^ \ s] +)\ s +((\ S + \ s)+)\ s +(。* )$ FORMAT = userCode ::「$ 1」TimeStamp ::「$ 2」ActionName ::「$ 3」Others ::「$ 4」在應用正則表達式之後,「Others」將--user和part識別爲它假定的數據閱讀我(空間..)TEST5作爲數據..你能幫助我嗎?謝謝 – cheeseng

+0

這是因爲(\ S + \ s)現在是你的第四組。不要讓這個圓括號作爲另一個小組來計算:(?> \ S + \ s)這意味着這個圓括號是一個非捕獲圓括號,僅用於分組目的。 – Untitled