C# 解析字符串以提取带有嵌套方括号的命令和关联参数

C# 解析字符串以提取带有嵌套方括号的命令和关联参数,c#,string,parsing,nested,C#,String,Parsing,Nested,我有一个包含嵌套括号的字符串: string commandLine = "position(1, random(1, random(1, 9)), random(3, 15))" 我想用以下规则解释这个字符串 命令名(参数1、参数2、参数3) 其中: “(”和“)”括号表示与命令名关联的参数 “,”逗号分隔每个参数 这使我相信,我首先需要设计一种方法来确定与每个命令关联的正确的开始括号和结束括号 从问题的最上面的答案看来,我不能使用正则表达式。那么,我应该如何完成这项任务 编辑: 我有一

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

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

你可以用很多方法来解决这个问题。这里有一个:

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


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

一些可怜的用户在没有任何建设性批评的情况下投了反对票。谢谢。为了你自己,不要说任何人是悲惨的,这只会疏远那些愿意帮助你的人,最好问问为什么这个问题被否决了。我理解你的意思,但这个形容词只适用于投否决票的人。它不是针对任何愿意给出答案的人。与其让提问者困惑不解,不如先发表评论然后否决投票,这不是最好的做法吗?@user1423893:这是最好的,但不是必需的。没有理由地说人们痛苦(事实上,这只是一个否决票——他们没有表现出骚扰你的快乐)对你既不礼貌也没有帮助。痛苦的评论是开玩笑的,他们的快乐并没有出现在我的脑海中,所以我不确定你是从哪里得到的。不过,这是我的观点。