我目前正在努力解决我必须解析的特别令人讨厌的字符串格式。字符串可以包含表示必须解析的变量属性的子字符串。想象一下类似的东西"ThisExampleStringContainsA[VARIABLE_PROPERTY]"
。此外,这些属性可以任意嵌套,并且它们可以具有不同的含义,具体取决于上下文。如果[VARIABLE_PROPERTY]
实际上不是变量的有效名称(当然必须在运行时确定),它只是成为整个字符串的正常部分,并且保持不变和逐字记录。接下来,没有无效的字符串,因为左方括号的数量不需要与右括号的数量匹配!This]Is[A[Valid]]][ExampleToo!
. 还有更多规则,但这会给你一个想法。
所以,目前我不确定如何处理这个问题。我的第一次尝试以一堆令人难以置信的 if 和 else 告终,我越来越注意到解决方案应该适当地包含某种状态概念。现在,我越来越多地考虑使用自动机来做到这一点。但是,我遇到的自动机只是纯粹的理论构造。我从来没有遇到过实际的实现。此外,自动机传统上用于验证单词,即确定它是否属于正式定义的语言。不用说,我很难对这种语言做出正式的定义。
你会如何处理这个问题?你认为实际实现自动机是一种理智的方法吗?您将如何从 OO 设计的角度对此进行建模?该项目在 C# 中,如果这有什么不同的话。你会建议一些完全不同的东西吗?
/Edit:我的描述可能有点误导,这里有一些详细信息:对我来说,问题是以正确的顺序(从最里面到最外面)找到属性。一旦你确定了下一个要解析的属性,用它的最终值进行实际替换就相对容易了。
让我们以上面的例子为例,我会给你一个逐步的例子来说明应该发生的事情。完整的输入字符串是:This]Is[A[Valid]]][ExampleToo!
第一个右括号和最后一个左括号只是普通字符,因为它们不包含任何内容。对于不在匹配括号对之间的所有字符也是如此。这给我们留下了部分[A[Valid]]]
。必须首先解决最里面的属性,即[Valid]
. 方括号只是将属性标识字符串括起来,Valid
我们将要解析的属性名称也是如此。比方说,这个字符串实际上确实标识了一个属性,并且它被替换为它的实际值,比方说Foo
。包括括号在内的标识字符串被替换,因此[Valid]
变为Foo
. 现在,我们必须看看[AFoo]]
. 让我们假设AFoo
没有标识一个属性,它使子字符串保持不变(包括括号)。最后,后面的第二个右括号AFoo
没有匹配的左括号,因此也只是一个字符。处理完成后,整个字符串将显示为:This]Is[AFoo]][ExampleToo!
我希望这个例子能让事情更清楚一点。请记住,我在这里简化了字符串格式!这只是给你一个想法,我面临什么困难。我不期望工作代码,我正在寻找可以让我了解如何解决问题的答案。由于必须对数千个字符串进行此解析,因此解决方案必须具有某种合理的性能。