C# 正则表达式-使用符号匹配,但不使用';我不能替换它们

C# 正则表达式-使用符号匹配,但不使用';我不能替换它们,c#,regex,C#,Regex,我想在正则表达式模式中使用符号来查找匹配项,但我不想替换它们。这是用于C#中的类和命名空间操作 例如: MyNamespaceLib.EntityDataModelTests.TestsMyClassTests+MyInnerClassTests 必须替换为: MyNamespaceLib.EntityDataModel.TestsMyClass+MyInnerClass (注意,只有“Tests”出现在名称空间部分的末尾时才被替换,而不是作为类/名称空间名称的一部分时) 我已经成功地找到了匹配

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

例如:

MyNamespaceLib.EntityDataModelTests.TestsMyClassTests+MyInnerClassTests

必须替换为:

MyNamespaceLib.EntityDataModel.TestsMyClass+MyInnerClass

(注意,只有“Tests”出现在名称空间部分的末尾时才被替换,而不是作为类/名称空间名称的一部分时)

我已经成功地找到了匹配的第一部分,但我正在努力保持替换的匹配中的符号

到目前为止,我已经:

var input=“MyNamespaceLib.EntityDataModelTests.TestsMyClassTests+MyInnerClassTests”

var output=Regex.Replace(输入,“Tests[.+]|$”,“”)

我尝试过使用非捕获组,但我怀疑这不是我试图使用它的方式


谢谢

那么您要做的是替换匹配项,而不是后跟
+
?使用:

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

var output = Regex.Replace(input, @"Tests([.+]|$)", m => m.Groups[1].Value);
此外,根据minitech的评论,您还可以在Regex.Replace的(string,string)重载中使用$1作为第一个捕获组,如:

var output = Regex.Replace(input, @"Tests([.+]|$)", "$1");
这就是说,正则表达式通常是只写代码,因此您始终可以执行简单而愚蠢的替换:

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

不,相反,我想替换基本上以“.”“+”或行尾结束的匹配。但是,如果“Tests”一词出现在命名空间或类名中,则不能替换它。@user1927385:
Tests(?![^.+])
,那么。很好,这很好。我从来没有在正则表达式中使用过lookaheads,所以我会去读更多。谢谢minitech。谢谢minitech,你的回答很快解决了我的问题。你还可以做
?=
的正面预测(例如
测试(?=[.+]
)。是的,它会起作用,我试图用一个正则表达式模式来完成这一切。如果我不能让它起作用,我会最后完成。是的,这已经完成了,我会尝试在一分钟内编写一个示例。如果你想用组的值替换某个对象,你可以在字符串中完成:
RegEx.replace(…,“$1”)
我不知道,我会更新答案。无论如何,我喜欢lambdas:)
var output = input.Replace("Tests+","").Replace("Tests.","") ...;