RegEx - 使用符号匹配但不替换它们

时间:2012-12-24 22:44:04

标签: c# regex

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

例如:

  

MyNamespaceLib.EntityDataModelTests.TestsMyClassTests+MyInnerClassTests

必须将

替换为:

  

MyNamespaceLib.EntityDataModel.TestsMyClass+MyInnerClass

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

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

到目前为止,我有:

  

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

     

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

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

谢谢!

2 个答案:

答案 0 :(得分:6)

那么您要做的是替换匹配而非后跟.+?使用lookahead

@"Tests(?![.+])"

答案 1 :(得分:1)

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

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

另外,根据minitech的评论,您还可以在Regex.Replace的(字符串,字符串)重载中使用$ 1作为第一个捕获组,如:

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

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

var output = input.Replace("Tests+","").Replace("Tests.","") ...;