解析字符串以从嵌套括号中提取命令和相关参数

本文关键字:命令 提取 参数 字符串 嵌套 | 更新日期: 2023-09-27 18:09:00

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

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

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

CommandName(parameter1, parameter2, parameter3)

地点:

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

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

似乎从顶部回答这个问题,我不能使用正则表达式。那么我应该如何处理这个任务呢?

编辑:

有个想法。

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

的后续集合中右括号的索引。

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

position(1, random(1, random(1, 9)), random(3, 15))
Opening 1         2         3              4
Closing                          12              34

解析字符串以从嵌套括号中提取命令和相关参数

您可以通过多种方式来实现这一点。这里有一个:

使用正则表达式匹配所有出现的[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时,您已经成功地解析了所有内容,最终结果是添加到字典中的最后一个条目(您可以使用输入字符串作为键将其拉出)。如果正则表达式不匹配任何内容,并且输入字符串不是这种形式,则表示原始输入有语法错误。

这不是目前为止最有效的算法,但它很容易在高层实现,并且不需要编写冗长的逐字符解析代码。