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

时间:2014-02-26 02:21:56

标签: c# regex

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

输入字符串

  

Keepword mywordsecond mythirdword myfourthwordKeep

要替换的字符串

  

排除字符串

  

渴望出局

  

Keepword mysecond mythird myfourthKeep

4 个答案:

答案 0 :(得分:1)

一个单词中是否会有多个word?如果有多个,您想要替换所有这些吗?如果没有,这应该排除你:

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

解释:

  1. 首先,\b((?:(?!Keep|word)\w)*)会捕获第一次出现wordKeep之前的任何文字。

  2. 它看到的下一件事必须是word,如果它看到Keep或字符串的结尾,则匹配尝试会立即失败。

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

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

    鉴于您使用的是C#可以使用外观方法:

    Regex r = new Regex(@"(?<!Keep\w*)word(?!\w*Keep)");
    s1 = r.Replace(s0, "");
    

    但请不要。很少有正则表达式支持像.NET那样支持不受限制的外观,而且大多数问题都不能像这一样整齐地工作。

答案 1 :(得分:1)

string str = "Keepword mywordsecond mythirdword myfourthwordKeep";
str = Regex.Replace(str, "(?<!Keep)word", "");

我要把你链接到一个好的正则表达式备忘单here

答案 2 :(得分:0)

这适用于记事本++:

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

它使用“look ahead”。

答案 3 :(得分:0)

如果你想删除“Keep”所没有的所有“单词”,你可以使用负面的后面断言:

String input = "Keepword mywordsecond mythirdword myfourthwordKeep";
String pattern = "(?<!Keep)word";

String output = Regex.Replace(input, pattern, "");