假设我有以下正则表达式:
-(\d+)-
我想使用C#将第1组(\d+)
替换为AA
,以获得:
-AA-
现在我用以下命令替换它:
var text = "example-123-example";
var pattern = @"-(\d+)-";
var replaced = Regex.Replace(text, pattern, "-AA-");
但我真的不喜欢这样,因为如果我更改模式以匹配_(\d+)_
,我也将不得不用_AA_
更改替换字符串,这违反了DRY原则。
我在找类似的东西:
保持匹配文本的原样,但将组1更改为this text
,将组2更改为another text
...
编辑:
这只是一个例子。我只是在寻找一种通用的方式来做我上面说过的事情。
它应该适用于:
anything(\d+)more_text
和任何你能想象到的模式。
我所要做的就是只替换组,并保留比赛的其余部分。
发布于 2011-05-15 08:13:35
一个好主意可能是将所有内容封装在组中,无论是否需要识别它们。这样,您就可以在替换字符串中使用它们。例如:
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+)(?=-)
发布于 2011-05-15 08:13:59
您可以使用lookahead and lookbehind来完成此操作
var pattern = @"(?<=-)\d+(?=-)";
var replaced = Regex.Replace(text, pattern, "AA");
发布于 2014-08-27 03:42:15
我也需要这样做,我为它创建了以下扩展方法:
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")]
https://stackoverflow.com/questions/6005609
复制相似问题