Remplacez uniquement certains groupes par Regex

Supposons que j’ai la regex suivante:

-(\d+)- 

et je veux remplacer, en utilisant C #, le groupe 1 (\d+) par AA , pour obtenir:

 -AA- 

Maintenant je le remplace en utilisant:

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

Mais je n’aime pas vraiment cela, car si je change le motif pour qu’il corresponde à _(\d+)_ , je _AA_ aussi changer la chaîne de remplacement par _AA_ , ce qui est contraire au principe DRY.

Je cherche quelque chose comme:

Gardez le texte correspondant exactement comme il est, mais changez le groupe 1 par this text et le groupe 2 par another text

Modifier:
C’était juste un exemple. Je cherche juste un moyen générique de faire ce que j’ai dit ci-dessus.

Cela devrait fonctionner pour:

anything(\d+)more_text et tout motif que vous pouvez imaginer.

Tout ce que je veux faire, c’est de ne remplacer que les groupes et de garder le rest du match.

Une bonne idée pourrait être d’encapsuler tout ce qui se trouve à l’intérieur des groupes, qu’il soit nécessaire de les identifier ou non. De cette façon, vous pouvez les utiliser dans votre chaîne de remplacement. Par exemple:

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

ou en utilisant un MatchEvaluator:

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

Une autre façon, légèrement désordonnée, pourrait être d’utiliser un lookbehind / lookahead:

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

Vous pouvez le faire en utilisant lookahead et lookbehind :

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

J’avais aussi besoin de ça et j’ai créé la méthode d’extension suivante:

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

Usage:

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

Résultat:

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

Si vous ne souhaitez pas modifier votre modèle, vous pouvez utiliser les propriétés Index de groupe et Longueur d’un groupe correspondant.

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

Voici une autre belle option propre qui ne nécessite pas de changer votre modèle.

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

passer par le codage ci-dessous pour obtenir le remplacement de groupe séparé.

 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.ToSsortingng(); var fs = mts.Groups[1].Value.ToSsortingng(); var fss = mts.Groups[2].Value.ToSsortingng(); fss = Regex.Replace(fss, @"[\\\{\}\\\#\\\$\\\%\\\&\*\@\\\!\\\^+\-\\\=\\\~\\\:\\\" + dblqt + @"\\\;\\\`\\\']+", ""); return "" + fss + "" + fs; }, RegexOptions.IgnoreCase);