匹配字符串中的变量单词



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

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

名称
  • 命中/猛击/挤压/爪子/任何新名称的伤害点

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

我希望这个程序做的是解释我输入的正则表达式代码并吐出一个结果,上面写着:名称攻击新名称

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

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

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

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

。我的输出显示...

${char1} attacks ${char2}

每当游戏输出那串凯文击中乔希 10728 点伤害时。 到日志文件中,我正在使用的程序会拾取它并正确输出凯文攻击乔希到我的屏幕。

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

我试图更改正则表达式行以读取...

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

。但是当我遇到字符串凯文抨击德克萨斯州的乔希2132344伤害点时,例如,输出到我的屏幕最终是:

凯文抨击乔希攻击德克萨斯州。

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

任何关于我做错了什么或如何进一步更改该正则表达式行的帮助或提示将不胜感激!

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

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

我自己使用 GNU sed 尝试过这个:

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

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

如果程序使用你还没有的"攻击"的同义词,你仍然会有合理的输出;然后你可以修复你的正则表达式以包含新的同义词。

如果某人的名字中包含"bashes"(或其他什么),你肯定会遇到麻烦。

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

最新更新