2014-01-30 34 views
0

我有以下的輸出字符串使用正則表達式匹配來匹配輸出:如何使用正則表達式,如果輸出格式改變

person1 | Age 20 | M |Gender Male 
person2 | Age 11 | |Gender Female 
person3 | Age 23 | M |Gender Female 
person4 | Age 32 | |Gender Male 
person5 | Age 41 | M |Gender Male 
person11| Age 28 | M |Gender Female 
person12| Age 31 | M |Gender Male 
person10| Age 33 | |Gender Male 
person8 | Age 26 | |Gender Male 

在Java代碼中,我使用以下exgex以​​匹配上面的輸出:

"person[^\n]*1Age 20[^\n]*M[^\n]*Gender Male[^\n]*" + 
"person3[^\n]*Age 23[^\n]*M[^\n]*Gender Female[^\n]*" + 
"person5[^\n]*Age 41[^\n]*M[^\n]*Gender Male[^\n]*" + 
"person11[^\n]*Age 28[^\n]*M[^\n]*Gender Female[^\n]*" + 
"person12[^\n]*Age 31[^\n]*M[^\n]*Gender Male[^\n]*" 

但問題是每一個,有些時候的樣子時輸出字符串並不總是以相同的順序:

person1 | Age 20 | M |Gender Male 
person2 | Age 11 | |Gender Female 
person3 | Age 23 | M |Gender Female 
person4 | Age 32 | |Gender Male 
person11| Age 28 | M |Gender Female 
person12| Age 31 | M |Gender Male 
person5 | Age 41 | M |Gender Male 
person10| Age 33 | |Gender Male 
person8 | Age 26 | |Gender Male 

如果我使用相同的正則表達式匹配輸出字符串,它不匹配。

有什麼辦法可以解決這個問題嗎?

+3

你到底想要在這裏匹配什麼?或者說,你的最終目標是什麼? – tenub

+0

輸出字符串總是在變化。我想用第三列中的「M」匹配所有條目,但在第二個輸出字符串中,所有條目的順序都改變了,如果我仍然使用相同的正則表達式匹配,它將不起作用,那麼如何要解決這個問題? – ratzip

回答

0

強烈建議您將每個字符串拆分爲|並將其轉換爲可解析的對象。在本例中

^ *person *(?<person>.*?) *\| *age *(?<age>.*?) *\| *(?<someMarker>.*?) *\|gender *(?<gender>.*)$ 

http://regex101.com/r/pA4eP7

注意,在Java中你需要轉義反斜線的兩倍,因此\|將成爲:

但是,如果你只是想用正則表達式來解析這個,你可以使用這個\\|

此外請確保您使用的是regex case insensitive modifier

+0

是的,但我確實需要驗證person1是person1,pereson1的年齡是20 – ratzip

+0

那麼你肯定無法用正則表達式來構建它;如果你知道數據應該是什麼樣的,爲什麼它會以錯誤的順序出現?你在對什麼進行驗證?您需要將其分解並根據您的標準構建完整的解析器。 – brandonscript

+0

好吧,輸出中的數據是一樣的,但只是一段時間,每個條目的順序是不同的,所以在這種情況下,如何匹配呢? – ratzip