如何使用正则表达式和/或LINQ解析游戏日志?

3
我正在寻找最优雅的方法来解析这个问题。在我的正则表达式知识方面遇到了困难,也许正则表达式甚至不是最好的答案?
我有三个例子句子来说明我想做什么。我想将它们解析成四个部分:攻击者、攻击类型、伤害和目标。
攻击者: 始终为第一位的一个或多个单词,可以通过以"Your"结尾或's'结尾来识别。
攻击类型: 一或多个单词,只能由它们位于“攻击者”和“伤害”之间来识别。
伤害: 一个或多个(很少但存在)唯一且有限的单词。我有一个包含可能单词的列表。{"wounds", "decimates"等}。它们不存在于其他任何地方,因此没有攻击者被命名为"wounds"之类的风险。
目标: 可以通过它们位于伤害之后的所有单词来识别的一个或多个单词。

在你的例子“你的神力摧毁了邪恶术士!”中,目标是“邪恶术士”,“邪恶术士”还是只是“术士”? - Thomas Langston
根据描述,应该是“邪恶的术士”,不是吗? - Lucero
“邪恶的术士”是正确的吗? - cc81
这些是MUD日志吗?我喜欢MUDs :) - Jeff LaFay
它们是 MUD 日志,不过不是“真实”的名字。它们来自于 www.carrionfields.com。 - cc81
2个回答

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

非常感谢。我需要在这个网站上注册,这样我也可以支持你。 - cc81

0

你最好使用一个合适的词法分析器/语法分析器。

我建议你研究一下ANTLR:

http://www.antlr.org/

它拥有出色的用户界面,您可以设计自己的语言,测试它,然后让ANTLR生成C#代码来构建语法树。

这种解析并不适合使用正则表达式,并且与LINQ无关。


为什么不用正则表达式呢?语法中的终结符必须与正则表达式中的几乎相同,并且语法只有一个具有四个部分的产生式,因此在我看来这是非常无意义的。 - Lucero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接