一尘不染

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

c#

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

-(\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 以及您可以想象的任何模式。

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


阅读 228

收藏
2020-05-19

共1个答案

一尘不染

一个好主意是将所有内容封装在组中,无论是否需要标识它们。这样,您可以在替换字符串中使用它们。例如:

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+)(?=-)

2020-05-19