用正则表达式仅替换某些组

假设我有以下正则表达式:


-(\d+)-

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


-AA-

现在,我使用以下方法替换它:


var text = "example-123-example";

var pattern = @"-(\d+)-";

var replaced = Regex.Replace(text, pattern, "-AA-"); 

但是我并不是很喜欢这样,因为如果我更改模式以匹配_(\d+)_,那么我也将不得不替换替换字符串_AA_,这违反了DRY原则。


我正在寻找类似的东西:


使匹配的文本保持原样,但将Group 1 by this text和Group 2 by another text...


编辑:

那只是一个例子。我只是在寻找一种通用的方式来做我上面说的话。


它适用于:


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


我要做的就是只替换组,并保留其余的比赛。


有只小跳蛙
浏览 870回答 3
3回答

江户川乱折腾

一个好主意是将所有内容封装在组中,无论是否需要标识它们。这样,您可以在替换字符串中使用它们。例如:var pattern = @"(-)(\d+)(-)";var replaced = Regex.Replace(text, pattern, "$1AA$3");&nbsp;或使用MatchEvaluator:var replaced = Regex.Replace(text, pattern, m => m.Groups[1].Value + "AA" + m.Groups[3].Value);有点混乱的另一种方法是使用后向/超前:(?<=-)(\d+)(?=-)

米琪卡哇伊

您可以使用lookahead和lookbehind进行此操作:var pattern = @"(?<=-)\d+(?=-)";var replaced = Regex.Replace(text, pattern, "AA");&nbsp;

www说

我也有此需要,并为此创建了以下扩展方法:public static class RegexExtensions{&nbsp; &nbsp; public static string ReplaceGroup(&nbsp; &nbsp; &nbsp; &nbsp; this Regex regex, string input, string groupName, string replacement)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return regex.Replace(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; input,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m =>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var group = m.Groups[groupName];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var sb = new StringBuilder();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var previousCaptureEnd = 0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (var capture in group.Captures.Cast<Capture>())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var currentCaptureEnd =&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; capture.Index + capture.Length - m.Index;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var currentCaptureLength =&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; capture.Index - m.Index - previousCaptureEnd;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sb.Append(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.Value.Substring(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; previousCaptureEnd, currentCaptureLength));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sb.Append(replacement);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; previousCaptureEnd = currentCaptureEnd;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sb.Append(m.Value.Substring(previousCaptureEnd));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return sb.ToString();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; }}用法: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")]
打开App,查看更多内容
随时随地看视频慕课网APP