C# 正则表达式替换不包含特定字符串的所有匹配字

C# 正则表达式替换不包含特定字符串的所有匹配字,c#,regex,C#,Regex,如何使用正则表达式替换不包含特定字符串的匹配字符串 输入字符串 Keepword mywordsecond mywordsecond myfourthwordKeep 要替换的字符串 话 排除字符串 保持 期望输出 我的第二个神话我的第四个神话 这在记事本++中工作: (?<!Keep)word(?!Keep) (? 它使用“.”如果要删除所有未按“保留”进行的“单词”,则可以使用否定查找后断言: String input=“Keepword mywordsecond mythirdwo

如何使用正则表达式替换不包含特定字符串的匹配字符串

输入字符串

Keepword mywordsecond mywordsecond myfourthwordKeep

要替换的字符串

排除字符串

保持

期望输出

我的第二个神话我的第四个神话


这在记事本++中工作:

(?<!Keep)word(?!Keep)
(?

它使用“.”

如果要删除所有未按“保留”进行的“单词”,则可以使用否定查找后断言:

String input=“Keepword mywordsecond mythirdword myfourthwordKeep”;

String pattern=“(?一个单词中是否会有多个
单词
?如果有多个,是否要替换所有单词?如果没有,这将为您排序:

Regex r = new Regex(@"\b((?:(?!Keep|word)\w)*)word((?:(?!Keep)\w)*)\b");
s1 = r.Replace(s0, "$1$2");
解释:

  • 首先,
    \b((?:(?!Keep | word)\w)*
    捕获第一次出现
    word
    Keep
    之前的任何文本

  • 它看到的下一个东西必须是
    word
    ,如果它看到的是
    Keep
    或字符串的结尾,则匹配尝试立即失败

  • 然后
    ((?:(?!Keep)\w)*)\b
    捕获文本的其余部分,以确保其不包含
    Keep

  • 当面对这样的问题时,大多数用户的第一个冲动是匹配(在消费的意义上)只有他们感兴趣的字符串部分,使用lookarounds来建立上下文。编写正则表达式通常要容易得多,以便它在匹配时始终在字符串中向前移动。您可以捕获要保留的部分,以便通过组引用将它们插回结果字符串中(
    $1
    $2
    等)

    鉴于您使用的是
    C 35;
    ,您可以使用环顾法:

    Regex r = new Regex(@"(?<!Keep\w*)word(?!\w*Keep)");
    s1 = r.Replace(s0, "");
    
    Regex r=newregex(@“(?
    string str=“Keepword mywordsecond mythirdword myfourthwordKeep”;
    
    str=Regex.Replace(str,”(?我已经尝试了您的解决方案和hatcyl的解决方案,但是包含“keep”的字符串“word仍然被替换?@matinau我尝试了这个正则表达式,我发现它与您在问题中列出的所需输出相匹配:
    Keepword mysecond mythird myfourthKeep
    。那么这不正确吗?这是我的实际代码,我忘了在原始问题字符串filecontents=File.ReadAllText(File)中包含替换字符串;string pattern=@“(?@matinau上面的代码提供了您所需的输出。我不确定还能为您提供什么帮助。@matinau,请编辑您的问题并将代码添加到其中。我们不能在这样的注释中阅读它。
    Regex r = new Regex(@"(?<!Keep\w*)word(?!\w*Keep)");
    s1 = r.Replace(s0, "");
    
    string str = "Keepword mywordsecond mythirdword myfourthwordKeep";
    str = Regex.Replace(str, "(?<!Keep)word", "");