解析字符串以使用嵌套括号提取命令和关联参数

时间:2013-04-12 21:55:31

标签: c# string parsing nested

我有一个包含嵌套括号的字符串:

string commandLine = "position(1, random(1, random(1, 9)), random(3, 15))"

我想用以下规则来解释这个字符串

CommandName(parameter1,parameter2,parameter3)

其中:

  • '('和')'括号表示与命令名称相关的参数
  • ','逗号分隔每个参数

这让我相信我首先需要设计一种方法来确定与每个命令相关的正确的开始和结束括号。

this问题的最高回答看来,我无法使用正则表达式。那么我该如何处理这项任务呢?

编辑:

有一个想法。

计算第一个左括号后的'('括号)。 该数字表示后续')'

集合中右括号括号的索引

我的措辞让我失望,但我相信这是一个开始?

position(1, random(1, random(1, 9)), random(3, 15))

Opening 1         2         3              4
Closing                          12              34

1 个答案:

答案 0 :(得分:0)

你可以通过很多方式解决这个问题。这是一个:

使用正则表达式匹配所有出现的[a-z]+\s*\([^()]+\)。这仅匹配参数不包含任何其他命令的命令。在您的示例中,这些将是random(1, 9)random(3, 15)

对于每个匹配项,计算结果(或生成内存中的表示形式,无论您的是什么)。这应该不难,因为您可以轻松地隔离命令名称并在逗号上拆分以分隔参数(这里没有错误的机会,因为我们知道没有参数是命令)。

使用不明确的键作为键将结果存储在字典中。例如,假设参数通常以?开头是非法的,在第一步之后你可能会得到这个字典:

"?1" => [the result or representation of random(1, 9)]
"?2" => [the result or representation of random(3, 15)]

将原始匹配项替换为占位符?1?2。您现在已经删除了最里面的嵌套命令。重复该过程,根据需要参考字典;每次迭代都将消除最内层命令集。

当输入字符串(在成为几个转换的主题之后)被简化为?XXX形式时,您已成功解析所有内容,最终结果是添加到字典中的最后一个条目(您可以将其拉出来)使用输入字符串作为键)。如果正则表达式与任何内容都不匹配且输入字符串不是这种形式,则原始输入的语法错误。

到目前为止,这不是最有效的算法,但它很容易在高级别实现,并且不需要您编写繁琐的char-by-char解析代码。