我想在RegEx模式中使用符号来查找匹配项,但我不希望它们被替换。这适用于C#中的类和命名空间操作。
例如:
必须将
MyNamespaceLib.EntityDataModelTests.TestsMyClassTests+MyInnerClassTests
替换为:
MyNamespaceLib.EntityDataModel.TestsMyClass+MyInnerClass
(注意,当它出现在命名空间部分的末尾时,只有“测试”被替换,而不是当它是类/命名空间名称的一部分时)
我已经设法让第一部分找到匹配,但我正在努力将符号保留在替换的匹配中。
到目前为止,我有:
var input = "MyNamespaceLib.EntityDataModelTests.TestsMyClassTests+MyInnerClassTests";
var output = Regex.Replace(input, "Tests[.+]|$", "");
我尝试过使用非捕获组,但我怀疑它不适合我尝试使用它的方式。
谢谢!
答案 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.","") ...;