2010-12-01 37 views
3

我正在尋找最優雅的方式來解析這個。當我涉及到我的正則表達式知識時,我只是碰壁了,也許正則表達式甚至不是最好的答案?如何使用正則表達式和/或linq解析遊戲中的日誌?

我有三個例句來舉例說明我想做什麼。我想分解成四個部分。攻擊者,攻擊型,傷害和目標。

甘道夫的天上的忿怒讓你失望!

聖主教的大刀傷口佛羅多。

你的神力驅散邪惡的術士!

攻擊者: 一個或幾個總是第一個單詞,單詞可以通過「你的」或結尾的單詞來標識。

攻擊類型:一個或幾個單詞只能通過它們在「攻擊者」和「損害」之間進行識別。

損害:一個或多個(罕見但存在)單一且有限的單詞。我有一個可能的單詞列表。 {「傷口」,「decimates」等}。它們不存在於其他任何地方,因此沒有被攻擊者命名爲「傷口」或類似的風險。

目標:一個或幾個單詞可以識別出它們是損壞後的所有單詞。

+0

在您的例子`你的神力抽取邪惡術士',是目標`邪惡術士「,」邪惡術士「,還是」術士「? – 2010-12-01 21:08:39

+0

根據描述應該是'邪惡術士',不是? – Lucero 2010-12-01 21:15:02

+0

「邪惡術士」是對的 – cc81 2010-12-01 21:23:04

回答

2

下面的正則表達式將返回匹配有四個捕捉每一行:

^((?<attacker>Your)|(?<attacker>.*?)'s)\s+(?<type>.*\S?)\s+(?<damage>wounds|decimates|dismembers)\s+(?<target>.*)\p{P}\s*?$ 

請注意,您需要使用下面的正則表達式的選項,它的工作:

  • IGNORECASE
  • MultiLine
  • ExplicitCapture

然後,您可以查詢每個比賽的組的值(攻擊者,類型,傷害,目標)。

請注意,您需要填寫損害清單。

爲您的測試數據和我的正則表達式下面我正則表達式測試應用程序集來處理所有的比賽返回:

Attacker: Gandalfs 
Type: heavenly wrath 
Damage: DISMEMBERS 
Target: you 

Attacker: The Holy Prelate 
Type: slash 
Damage: wounds 
Target: Frodo 

Attacker: Your 
Type: divine power 
Damage: decimates 
Target: the evil Warlock 
0

你可能最好用適當的詞法分析器。

我調查ANTLR:

http://www.antlr.org/

它有一個很大的用戶界面,您可以設計自己的語言,測試和具有ANTLR生成C#,將建立語法樹。

這種解析並不適合正則表達式,並且與LINQ沒有任何關係。