用特定捕获组上的操作替换正则表达式的所有匹配

我有不同的Xml字符串,可以包含以下格式的一个或多个部分:

47862656 

中间的值可以改变。 我想用操纵值替换此元素的所有出现(从BBAN到IBAN是特定的)。

我在XMLModel类中使用属​​性Xml (XML字符串)创建了以下方法:

 string regexString = "()(?.*?)()"; Regex regex = new Regex(regexString); Match match = regex.Match(Xml); string AcctId = match.Groups["AcctId"].Value; string IBANizedAcctId = IBANHelper.ConvertBBANToIBAN(AcctId); Xml = Regex.Replace(Xml, regexString, string.Format("$1{0}$3", IBANizedAcctId)); 

这里的想法是regexString有三个捕获组,我用转换为IBAN的帐号替换中间值(帐号)。

不幸的是,这段代码不起作用:1)它确实捕获了AcctId的值,但它没有正确替换它,因为它丢失了最后一个部分。 2)它将匹配的所有出现替换为第一个中捕获的值,而它应该用捕获的特定值替换每个出现的值。

有没有办法在C#中做到这一点? 如果是这样,有人可以给我一些关于如何做到这一点的指示吗? 任何帮助将不胜感激。

除了通常不使用正则表达式来操纵XML。

 string regex = "(?<=).*?(?=)"; Xml = Regex.Replace(Xml, regex, delegate(Match m) { return IBANHelper.ConvertBBANToIBAN(m.Value); }); 

这使用积极向前看并向后看,以便匹配只是帐号,然后重载到Regex.Replace接受匹配评估器。

您不应该使用正则表达式来操纵XML,它们不是适合它的工具,并且不会始终有效。 例如,XML文件可以使用除ns1之外的名称空间前缀,映射到同一名称空间,并且它在语义上是等效的,但是你的正则表达式将不再起作用。

您应该使用XML解析器; 最容易使用的是Linq to XML:

 var doc = XDocument.Parse(Xml); var ns1 = XNamespace.Get("http://TheNamespaceMappedToTheNs1Prefix"); var elements = doc.Descendants(ns1 + "AcctId"); foreach (var e in elements) { e.Value = IBANHelper.ConvertBBANToIBAN(e.Value); } Xml = doc.ToString();