-2

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

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

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

命令名称(参数 1,参数 2,参数 3)

在哪里:

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

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

这个问题的最佳答案看来,我不能使用正则表达式。那么我应该如何处理这个任务呢?

编辑:

有一个想法。

在碰到第一个左括号后计算'('括号的数量。该数字表示在随后的')集合中右括号括号的索引

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

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

Opening 1         2         3              4
Closing                          12              34
4

1 回答 1

0

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

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

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

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

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

?1用占位符和替换原来的匹配项?2。您现在已经消除了最里面的嵌套命令。重复上述过程,按要求查阅字典;每次迭代都会消除最里面的命令集。

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

这不是迄今为止最有效的算法,但它很容易在高层次上实现,并且不需要您编写繁琐的逐字符解析代码。

于 2013-04-12T22:19:56.170 回答