匹配字符串中的变量单词

问题描述 投票:1回答:1

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

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

  • NAME击中/击打/击碎/爪子/任何NEWNAME为NUMBER点伤害。

如果重要的话,NUMBER将永远不会包含逗号或空格,动作动词(命中,敲击,等等)将只是一个单词,没有任何特殊字符,空格,数字等。

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

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

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

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

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

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

${char1} attacks ${char2}

每当比赛结束时凯文击中约什的伤害为10728分。到日志文件,我正在使用的程序选择它并正确输出Kevin攻击Josh到我的屏幕。

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

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

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

...但是当我遇到弦乐队时,凯斯对德克萨斯州的乔什造成了2132344点的伤害。例如,我屏幕的输出结果如下:

凯文巴什乔希攻击德克萨斯。

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

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

regex
1个回答
0
投票

这听起来更加神秘,但我认为问题不在于正则表达式,而是你使用正则表达式的工具。

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

我自己尝试使用GNU sed:

sed -e 's/for [[:digit:]]\+ points of damage//' -e 's/hits\|bashes\|crushes/attacks/'

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

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

如果某人的名字中包含“bashes”(或其他),你可以保证遇到麻烦。

应该改进第二个sed表达式,使其仅与单词边界相关,但我会将其作为练习留给读者。 :)

© www.soinside.com 2019 - 2024. All rights reserved.