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

C# C中的嵌套正则表达式替换#,c#,regex,C#,Regex,我对正则表达式不是很在行,但我了解基本的规则。我试图找出如何根据匹配中的某个值进行条件替换。例如: 假设我有一些嵌套的字符串结构,如下所示: "[id value]"//id and value are space delimited. id will never have spaces A) "[vehicle [toyota camry]]" or B) "[animal [dog rufus]]" id是命名[]项的字符串id,value是另一个嵌套的[id-value]项。valu

我对正则表达式不是很在行,但我了解基本的规则。我试图找出如何根据匹配中的某个值进行条件替换。例如:

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

"[id value]"//id and value are space delimited.  id will never have spaces
A) "[vehicle [toyota camry]]"
or
B) "[animal [dog rufus]]"
id
是命名
[]
项的字符串id,
value
是另一个嵌套的
[id-value]
项。
value
可能为空,但我现在不担心这一点

如果我有这样的东西:

"[id value]"//id and value are space delimited.  id will never have spaces
A) "[vehicle [toyota camry]]"
or
B) "[animal [dog rufus]]"
我希望能够基于
id
调用某个函数(例如ToString()),该函数在regex.Replace从最内部的
[]
结构执行时得到输出

从一个伪代码示例开始:

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]] ... ],
i、 e.所有支架是否在末端闭合?你的问题和例子似乎说明了这一点。如果这是真的,那么使用正则表达式解析它就没有那么困难了,这取决于您实际需要解析器做什么

比如说,你可以使用

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());
}
您可以递归地调用Parse来访问内部嵌套级别


请询问您是否有我不理解的需求=)

这些需求是否只有两个深度,而从来没有更深过?不,它们可以是无限深的,至少在理论上是如此。实际上,它们通常最多为5到6个。这也不是真正的应用程序,我或多或少只是在尝试学习正则表达式,遇到了这个问题。我认为你的例子是错误的,你希望第二个是第一个,因为它的格式是Strings。你能提供一个嵌套三或四个深的例子吗?@Shawn:如果它们任意深,你不能用正则表达式这样做。你需要一个解析器。它可以用.NET来完成,它非常难看。请看这里:这个链接看起来直接解决了我的问题,但我没有正则表达式技能来根据我的需要进行调整。听起来解析器是更好的方法。@James,从更理论/数学的意义上讲,正则表达式实际上只匹配/解析正则语言,但大多数现代正则表达式实现可以匹配/解析更多的正则语言。我甚至不是在谈论递归模式,想想“回溯引用”:
()..\1
@James,请注意,我从来没有说过在验证/解析(X)HTML等语言时使用regex是个好主意。我只是说,你不能仅仅因为目标语言/字符串不是“常规的”,就说某些事情不能用(现代的)正则表达式引擎来完成。例如,如果您想匹配字符串中至少出现4次的字符,可以使用类似于:
()(?:*?\1){4}
的正则表达式,它匹配目标字符串
abcdbccaadddd
中的
cdbccaac
。但是,这种“语言”是,AFAIK,不规则的(但适合(现代)regex,IMO)。@James。。。当然,我同意你的观点,HTML和正则表达式不应该属于同一个句子(除非出现“not”或“never”):)只有当元组的第二个元素始终是需要递归的元素时,这才有效。我自己还没有验证过,但我很确定这将无法解析“[[ab][cd]]”。当然,这取决于OP的语法。