解析游戏的控制台命令?

时间:2012-01-12 20:25:27

标签: regex parsing string-matching

我需要能够处理看起来像这样的数据:

set setting1 "bind button_x +actionslot1;bind button_y \" bind button_x +stance \" "

bind button_a jump

set setting2 1 1 0 1

toggle setting_3 " \"value 1\" \"value 2\" \"value 3\" "

这些是游戏控制台的一些命令看起来像,我正在尝试编写一种类似于游戏将以相同方式解释代码的模拟器。

首先想到的是正则表达式,但我不确定它是最好的选择。例如,当匹配设置的值时,我可能尝试/set [\w_]+ "?(.+)"?/之类的东西,但是通配符匹配结束引号,因为它不是懒惰的,但如果我使它变得懒惰,它会匹配值内的引号。如果我贪婪并阻止它与引号匹配,它将与值中的转义引号不匹配。

即使有可能的正则表达式解决方案,它们似乎是错误的选择。之前我曾询问过像Visual Studio和Notepad ++这样的程序是如何知道哪些括号和花括号匹配的,而且我被告知在某些方面有类似于正则表达式但更强大的东西。

我能想到的另一件事就是逐个字符地查看代码行,并使用布尔值来确定当前字符的状态。

我有什么选择?游戏开发人员用什么来处理控制台命令?

编辑:这是另一个可能阻止我使用正则表达式的命令:

set setting4 "bind button_a \" bind button_b "\" set setting1 0 \" " \" "

这些命令不仅包括转义引号,还包含转义引号内"\"方式的引号。

2 个答案:

答案 0 :(得分:2)

我不想让你走上正则表达式的道路 - 你说正确的非正则表达式解决方案可能更合适(我只是不知道它们是什么)。但是,这里有一个可能的正则表达式应该修复你的报价问题:

/set [\w_]+ "?((\\"|[^"])+)"?/

我将.+更改为(\\"|[^"])+。基本上它匹配任何非引用的\" OR的出现。换句话说,它将匹配除了未转义的引号之外的任何内容。

同样,如果有人可以提出更复杂的非正则表达式解决方案,那么你应该强烈考虑它。

编辑:您提供的更新示例打破了此解决方案,我认为它会破坏任何正则表达式解决方案。

编辑2:以下是正则表达式的C#字符串版本。它使用@告诉编译器将字符串视为verbatim literal,这意味着它将\忽略为转义字符。唯一需要注意的是,为了在逐字字面值中表示",您必须将其键入"",但它仍然比在任何地方都使用斜杠更好。鉴于正则表达式中转义序列的普遍存在,我建议在任何必须在字符串中键入正则表达式的地方使用逐字文字。

string pattern = @"set [\w_]+ ""?((\\""|[^""])+)""?"

答案 1 :(得分:2)

我建议你阅读Lexical Analysis ,这是使用语法对文本进行标记的过程。 我认为它会帮助你做你想做的事情。