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