匹配字符串

时间:2018-03-08 17:12:54

标签: regex

这听起来非常讨厌,但是我玩这个将游戏中的事件写入日志文件的在线游戏。我正在使用的程序能够读取此日志文件,并且它还能够解释正则表达式。我的目标是编写一个regex命令,分析该日志文件中的某个字符串,然后将字符串的某些部分吐出到我的屏幕上。

写入日志文件的字符串具有以下语法(变量以粗体显示):

  • NAME 点击/敲击/粉碎/抓爪/ NEWNAME NUMBER 点伤害。

如果重要, NUMBER 将永远不会包含逗号或空格,动作动词(hits,bashes,whatever)将只是一个单词而没有任何特殊字符,空格,数字等

我希望此计划要做的是解释我输入的正则表达式代码并吐出一个结果: NAME 攻击 NEWNAME

问题是, NAME NEWNAME 可以具有以下可能性范围(随机选择名称和示例):

  • 凯文
  • 凯文的宠物
  • 凯文来自俄勒冈州
  • 凯文来自俄勒冈州的宠物
  • 凯文来自俄勒冈州的宠物(注意那里的重音而不是撇号)

如果像凯文击中乔希那样受到10728点伤害,那就非常简单。在这种情况下,我的正则表达式是以下代码块(请注意,程序将{N}通配符解释为任何数字,而不需要正则表达式):

(?<char1>\w+) \w+ (?<char2>\w+) for {N} points of damage.

...我的输出显示......

${char1} attacks ${char2}

每当游戏输出那串 Kevin击中Josh,造成10728点伤害。到日志文件时,我正在使用的程序选择并正确输出 Kevin攻击Josh 到我的屏幕。

但是,当 NAME NEWNAME 中存在空格,撇号,重音符号和/或三者的任意组合时,使用该正则表达式行会导致失败

我试图改变正则表达式行来阅读......

(?<char1>[a-zA-Z0-9_ ]+) \w+ (?<char2>[a-zA-Z0-9_ ]+) for {N} points of damage.

...但是当我遇到字符串 Kevin为德克萨斯州的Josh造成2132344点伤害时。,例如,我屏幕的输出结果为:

  

Kevin抨击Josh袭击德克萨斯州。

我尝试了不同的事情,但最终没有提出一些东西,当这两个变量突然出现 NAME 攻击 NEWNAME 的正确格式时包含空格,撇号,重音符号和/或三者的任意组合。

对于我做错了什么或如何进一步改变该正则表达式行的任何帮助或提示都将非常感激!

1 个答案:

答案 0 :(得分:0)

这听起来更古怪,但是我认为问题不在于正则表达式,而是您在其中使用正则表达式的工具。

到目前为止,您最大的问题是名字。我建议忽略名称,而只关注您所知道的元素。剩下的就是名字。

我自己使用GNU sed进行了尝试:

pk=object.pk

您知道,首先我们可以消除句子的结尾,这完全是多余的。然后,我们只需将动词切换为“攻击”即可。

如果该程序使用了您尚未使用的“攻击”的同义词,那么您仍将获得合理的输出;然后,您可以修复您的正则表达式以包括新的同义词。

如果有人的名字中包含“ bashes”(或其他内容),肯定会给您带来麻烦。

第二个sed表达式应该改进为仅与单词边界相关,但我将其留给读者练习。 sed -e 's/for [[:digit:]]\+ points of damage//' -e 's/hits\|bashes\|crushes/attacks/'