6

我想在 RegEx 模式中使用符号来查找匹配项,但我不希望它们被替换。这是用于 C# 中的类和命名空间操作。

例如:

MyNamespaceLib.EntityDataModelTests.TestsMyClassTests+MyInnerClassTests

必须替换为:

MyNamespaceLib.EntityDataModel.TestsMyClass+MyInnerClass

(注意,只有“测试”出现在命名空间部分的末尾时才会被替换,而不是当它是类/命名空间名称的一部分时)

我已经设法在第一部分找到匹配项,但我正在努力将符号保留在替换的匹配项中。

到目前为止,我有:

var input = "MyNamespaceLib.EntityDataModelTests.TestsMyClassTests+MyInnerClassTests";

var output = Regex.Replace(input, "Tests[.+]|$", "");

我尝试过使用非捕获组,但我怀疑它不适合我尝试使用它的方式。

谢谢!

4

2 回答 2

8

所以你想要做的是替换带 a.或 a 的匹配项+?使用前瞻

@"Tests(?![.+])"
于 2012-12-24T22:46:35.980 回答
1

您可以使用 Regex.Replace 方法的MatchEvaluator重载,其中用于替换匹配的字符串是动态生成的。我在捕获组中获得了特殊符号(并且第一个捕获组始终是匹配的第1组),并将匹配替换为该值,如下所示:

var output = Regex.Replace(input, @"Tests([.+]|$)", m => m.Groups[1].Value);

此外,根据 minitech 的评论,您还可以将 $1 用于 Regex.Replace 的 (string, string) 重载中的第一个捕获组,例如:

var output = Regex.Replace(input, @"Tests([.+]|$)", "$1");

也就是说,正则表达式通常是只写代码,所以你总是可以做一个愚蠢而简单的替换:

var output = input.Replace("Tests+","").Replace("Tests.","") ...;
于 2012-12-24T22:49:27.053 回答