C#中的嵌套正则表达式替换

我对正则表达式并不是那么好,但我理解基础知识。 我试图找出如何根据匹配中的某个值进行条件替换。 例如:

假设我有一些嵌套的字符串结构,如下所示:

"[id value]"//id and value are space delimited. id will never have spaces 

id是一些用于命名[]项的字符串id, value是另一个嵌套的[id value]项。 value可能是空的,但我现在并不担心。

如果我有这样的事情:

 A) "[vehicle [toyota camry]]" or B) "[animal [dog rufus]]" 

我希望能够调用某个函数(例如ToString())基于获取输出的id作为regex.Replace从内部最[]结构执行。

来自示例A伪代码:

 string Return = "{0}"; var 1stValueComboID = GetInteriorValue/IDFrom("[vehicle [toyota camry]]"); //1stValueComboID.ToString() = "Company: Toyota, Make: Camry" Return = Format.String(Return,1stValueIDCombo.ToString()); var 2stValueComboID = GetSecondValue/IDFrom("[vehicle [toyota camry]]"); //2stValueComboID.ToString() = "Type: Vehicle, {0}" Return = Format.String(Return,2ndValueIDCombo.ToString()); 

这个样本显然与正则表达式无关,但它有希望说明我正在尝试做的事情。

JoshD正确地指出,你提出的这个语法(具有匹配的括号对)无法使用正则表达式进行解析。 您需要构建具有递归下降行为的自定义解析器。

我是否理解正确,您要解析的所有字符串都具有该表单

 [id1 [id2 [id3 [id4 .. value]] ... ], 

即所有括号在结束时都关闭了吗? 你的问题和例子似乎都是这样说的。 如果这是真的,使用正则表达式解析它并不困难,这取决于你实际需要解析器做什么。

你可以说,你可以使用

 static Tuple Parse(String s) { var match = Regex.Match(s, @"^\[(\w*) (.*)\]$", RegexOptions.None); return new Tuple(match.Groups[1].ToString(), match.Groups[2].ToString()); } 

这会导致

 var result = Parse("[animal [dog rufus]]"); // result = {Item 1 = "animal", Item2 = "[dog rufus]" } var inner = Parse(result.Item2); // inner = { Item 1 = "dog", Item2 ="rufus"} 

您可以递归调用Parse以获得内部嵌套级别。

请问你是否有我不明白的要求=)