如何使用正则表达式替换不包含特定字符串的匹配字符串?
输入字符串
Keepword mywordsecond mythirdword myfourthwordKeep
要替换的字符串
字
排除字符串
请
渴望出局
Keepword mysecond mythird myfourthKeep
答案 0 :(得分:1)
一个单词中是否会有多个word
?如果有多个,您想要替换所有这些吗?如果没有,这应该排除你:
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
。
当面对这样的问题时,大多数用户的第一个冲动是匹配(在消费意义上)他们感兴趣的字符串部分,使用外观来建立上下文。编写正则表达式通常要容易得多,以便它在匹配时始终向前移动。您捕获要保留的部分,以便通过组引用($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)
答案 3 :(得分:0)
如果你想删除“Keep”所没有的所有“单词”,你可以使用负面的后面断言:
String input = "Keepword mywordsecond mythirdword myfourthwordKeep";
String pattern = "(?<!Keep)word";
String output = Regex.Replace(input, pattern, "");