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以获得内部嵌套级别。
请问你是否有我不明白的要求=)