【问题标题】:Parsing a string to extract a command and associated parameters with nested brackets解析字符串以提取带有嵌套括号的命令和相关参数
【发布时间】:2013-04-12 21:55:31
【问题描述】:

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

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

【问题讨论】:

  • 一些可怜的用户在没有任何建设性批评的情况下投了反对票。谢谢。
  • 看在你自己的份上,不要去骂人可怜,这只会疏远愿意帮助你的人,最好问问为什么这个问题被否决了。
  • 我理解你的意思,但这个形容词只适用于投反对票的人。它不是针对任何愿意给出答案的人。最好先发表评论然后投反对票,而不是让提问者感到困惑?
  • @user1423893:最好,但这不是必需的。在没有正当理由的情况下称人们悲惨(实际上,这只是投反对票——他们没有表现出骚扰你的乐趣)既不文明也不对你有帮助。
  • 悲惨的评论是开玩笑的,我没有想到他们的快乐,所以我不确定你从哪里得到的。虽然点了。

标签: c# string parsing nested


【解决方案1】:

您可以通过多种方式解决此问题。这是一个:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    相关资源
    最近更新 更多