我不太擅长正则表达式,但我了解基础知识。我试图弄清楚如何根据匹配中的某个值进行条件替换。例如:
假设我有一些嵌套的字符串结构,如下所示:
"[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());
这个示例显然与正则表达式无关,但它希望说明我正在尝试做的事情。
我是否理解正确,您想要解析的所有字符串都具有以下形式
[id1 [id2 [id3 [id4 .. value]] ... ],
即所有括号最后都关闭?你的问题和例子似乎表明了这一点。如果这是真的,那么使用正则表达式解析它并不困难,具体取决于您实际需要解析器做什么。
你可以说,使用
static Tuple<String, String> Parse(String s)
{
var match = Regex.Match(s, @"^\[(\w*) (.*)\]$", RegexOptions.None);
return new Tuple<String, String>(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 来到达内部嵌套级别。
如果您有我不明白的要求,请询问 =)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)