高效修改PVF
周末在修改某一款电子游戏的PVF(游戏内容文件)时,遇到了一个问题,我需要将游戏中的原有的穿戴多件装备才有的套装效果修改为一件装备即可激活套装效果。装备套装描述文件如下图所示。
可以看到文件类似于XML格式,每个piece set ability
描述了穿戴n件套时对应的效果及描述。我需要将分布在多个piece set ability
标签中的子标签的内容合并到一个piece set ability
标签中。这样就可以实现一件装备即可激活套装效果的功能。
由于游戏中的套装较多,对应文件有170个,单个文件手动修改要40-50秒,所有文件改完需要大约2个小时。这个工作量对于我来说太大了。这里的工作基本上是重复性的,完全可以通过正则表达式来实现自动替换。
正则替换
这里我使用vim自带的正则表达式功能来实现自动替换。首先需要对内容进行匹配,对应的正则表达式如下:
1 | /\v\[piece set ability\]\n\t\d\t\n(\_.{-})\t\[skill data up\]\n(\_.{-})\t\[\/skill data up\]\n\t\[parameter basic explain]\n\t`(\_.{-})`\n\[\/piece set ability\]\n\n\[piece set ability\]\n\t\d\t\n(\_.{-})\t\[skill data up\]\n(\_.{-})\t\[\/skill data up\]\n\t\[parameter basic explain]\n\t`(\_.{-})`\n\[\/piece set ability\]\n\n\[piece set ability\]\n\t\d\t\n(\_.{-})\t\[skill data up\]\n(\_.{-})\t\[\/skill data up\]\n\t\[parameter basic explain]\n\t`(\_.{-})`\n\[\/piece set ability\]\n |
这段正则除了比较长,并不复杂,主要功能就是匹配套装描述文件的三组piece set ability
,并将其中的三部分匹配到三个捕获组中,一共9个捕获组,刚好不超过vim对捕获组的数量限制。这里对于子标签的内容,由于其可能存在换行,因此使用了\_.
来匹配包括换行在内的任意字符,同时使用{-}
开启非贪婪模式,以便匹配到最近的结束标签,这里的匹配语法和日常使用的正则表达式存在一些差异,需要注意。
接下来就是替换的问题,这里直接使用vim的替换命令。
1 | :%s##\[piece set ability\]\r\t1\r\t[anti evil]\r\t40\r\1\4\7\t[skill data up]\r\2\5\8\t[\/skill data up]\r\t[parameter basic explain]\r\t`\---\r\3\r---\r\6\r---\r\9`\r[\/parameter basic explain]#g |
由于替换内容中包含了\
字符,因此这里使用了#
作为替换命令的分隔符,这样就不需要对\
进行转义。这里的替换命令比较长,主要是将捕获组中的内容按照一定的格式进行替换,这里的替换内容和原内容的格式是一致的,只是将三个piece set ability
标签中的内容合并到了一个标签中。
但在对每个文件进行内容匹配和替换过程中发现还是太繁琐了,每次都需要执行一次上一次的命令,然后切换到下一个文件,有没有办法让这个步骤更简单一点呢?
鼠标宏
这里就可以直接借助鼠标宏来将执行命令,切换文件这几个步骤合并。打开鼠标自带的鼠标宏编辑软件,添加如下鼠标宏。
其中前三个表示输入@:
用于在vim中重复上一次的命令。Ctrl+H+J
用于切换到文件管理器(我这里使用的是Neotree),并移动到下一个文件。最后回车打开文件。这样我就可以点击一次鼠标侧键,就可以完成一次文件的内容匹配和替换,然后切换到下一个文件,非常方便。
总结
整个过程中,除了编写正则匹配表达式花了大约半个小时,剩下的工作仅用了不到10分钟就完成了。比预期节省了一半以上的时间,而且这里的正则表达式也可以用于其他类似的问题。