我需要能够处理看起来像这样的数据:
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 \" " \" "
这些命令不仅包括转义引号,还包含转义引号内"\"
方式的引号。
答案 0 :(得分:2)
我不想让你走上正则表达式的道路 - 你说正确的非正则表达式解决方案可能更合适(我只是不知道它们是什么)。但是,这里有一个可能的正则表达式应该修复你的报价问题:
/set [\w_]+ "?((\\"|[^"])+)"?/
我将.+
更改为(\\"|[^"])+
。基本上它匹配任何非引用的\"
OR的出现。换句话说,它将匹配除了未转义的引号之外的任何内容。
同样,如果有人可以提出更复杂的非正则表达式解决方案,那么你应该强烈考虑它。
编辑:您提供的更新示例打破了此解决方案,我认为它会破坏任何正则表达式解决方案。
编辑2:以下是正则表达式的C#字符串版本。它使用@
告诉编译器将字符串视为verbatim literal,这意味着它将\
忽略为转义字符。唯一需要注意的是,为了在逐字字面值中表示"
,您必须将其键入""
,但它仍然比在任何地方都使用斜杠更好。鉴于正则表达式中转义序列的普遍存在,我建议在任何必须在字符串中键入正则表达式的地方使用逐字文字。
string pattern = @"set [\w_]+ ""?((\\""|[^""])+)""?"
答案 1 :(得分:2)
我建议你阅读Lexical Analysis ,这是使用语法对文本进行标记的过程。 我认为它会帮助你做你想做的事情。