用正则expression式replace一些组

假设我有以下的正则expression式:

-(\d+)- 

我想使用C#将组1 (\d+)replace为AA ,以获得:

 -AA- 

现在我正在使用它来replace它:

 var text = "example-123-example"; var pattern = @"-(\d+)-"; var replaced = Regex.Replace(text, pattern, "-AA-"); 

但我不太喜欢这个,因为如果我改变模式来匹配_(\d+)_ ,我将不得不通过_AA_改变replacestring,这是违背DRY原则的。

我正在寻找像这样的东西:

保持匹配的文本到底是怎样的,但是通过this text改变组1,通过another text改变组2。

编辑:
那只是一个例子。 我只是寻找一个通用的方式来做我上面说的。

它应该适用于:

anything(\d+)more_text和任何可以想象的模式。

我想要做的只是replace组,并保持比赛的其余部分。

不pipe是否需要识别,一个好主意可能是将所有内容封装在组中。 这样,你可以在你的replacestring中使用它们。 例如:

 var pattern = @"(-)(\d+)(-)"; var replaced = Regex.Replace(text, pattern, "$1AA$3"); 

或使用MatchEvaluator:

 var replaced = Regex.Replace(text, pattern, m => m.Groups[1].Value + "AA" + m.Groups[3].Value); 

另一种方式,稍微凌乱,可能会使用向后看/前瞻:

(?<=-)(\d+)(?=-)

你可以使用前视和后视 :

 var pattern = @"(?<=-)\d+(?=-)"; var replaced = Regex.Replace(text, pattern, "AA"); 

如果您不想更改模式,则可以使用匹配组的“组索引”和“长度”属性。

 var text = "example-123-example"; var pattern = @"-(\d+)-"; var regex = new RegEx(pattern); var match = regex.Match(text); var firstPart = text.Substring(0,match.Groups[1].Index); var secondPart = text.Substring(match.Groups[1].Index + match.Groups[1].Length); var fullReplace = firstPart + "AA" + secondPart; 

我也需要这个,我为它创build了下面的扩展方法:

 public static class RegexExtensions { public static string ReplaceGroup( this Regex regex, string input, string groupName, string replacement) { return regex.Replace( input, m => { var group = m.Groups[groupName]; var sb = new StringBuilder(); var previousCaptureEnd = 0; foreach (var capture in group.Captures.Cast<Capture>()) { var currentCaptureEnd = capture.Index + capture.Length - m.Index; var currentCaptureLength = capture.Index - m.Index - previousCaptureEnd; sb.Append( m.Value.Substring( previousCaptureEnd, currentCaptureLength)); sb.Append(replacement); previousCaptureEnd = currentCaptureEnd; } sb.Append(m.Value.Substring(previousCaptureEnd)); return sb.ToString(); }); } } 

用法:

 var input = @"[assembly: AssemblyFileVersion(""2.0.3.0"")][assembly: AssemblyFileVersion(""2.0.3.0"")]"; var regex = new Regex(@"AssemblyFileVersion\(""(?<version>(\d+\.?){4})""\)"); var result = regex.ReplaceGroup(input , "version", "1.2.3"); 

结果:

 [assembly: AssemblyFileVersion("1.2.3")][assembly: AssemblyFileVersion("1.2.3")] 

这是另一个不错的干净选项,不需要改变你的模式。

  var text = "example-123-example"; var pattern = @"-(\d+)-"; var replaced = Regex.Replace(text, pattern, (_match) => { Group group = _match.Groups[1]; string replace = "AA"; return String.Format("{0}{1}{2}", _match.Value.Substring(0, group.Index - _match.Index), replace, _match.Value.Substring(group.Index - _match.Index + group.Length)); }); 

通过下面的编码来获得单独的组更换。

 new_bib = Regex.Replace(new_bib, @"(?s)(\\bibitem\[[^\]]+\]\{" + pat4 + @"\})[\s\n\v]*([\\\{\}a-zA-Z\.\s\,\;\\\#\\\$\\\%\\\&\*\@\\\!\\\^+\-\\\=\\\~\\\:\\\" + dblqt + @"\\\;\\\`\\\']{20,70})", delegate(Match mts) { var fg = mts.Groups[0].Value.ToString(); var fs = mts.Groups[1].Value.ToString(); var fss = mts.Groups[2].Value.ToString(); fss = Regex.Replace(fss, @"[\\\{\}\\\#\\\$\\\%\\\&\*\@\\\!\\\^+\-\\\=\\\~\\\:\\\" + dblqt + @"\\\;\\\`\\\']+", ""); return "<augroup>" + fss + "</augroup>" + fs; }, RegexOptions.IgnoreCase);