2010-12-01 45 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没有任何关系。