C#替换除两个案例之外的所有内容

时间:2014-08-14 07:00:13

标签: c# regex regex-negation

我该怎么办呢。

new Regex("([^my]|[^test])").Replace("Thats my working test", "");

我会得到这个:

my test

但我会得到一个空字符串,因为一切都将被替换为无。

提前谢谢你!

3 个答案:

答案 0 :(得分:5)

您可以使用这个基于前瞻性的正则表达式:

new Regex("(?!\b(?:my|test)\b)\b(\w+)\s*").Replace("Thats my working test", "");

//=> my test

您在字符类中使用否定不正确:([^my]|[^test])

由于在内部字符类中,每个字符都被单独检查而不是字符串。

RegEx Demo

答案 1 :(得分:0)

使用此正则表达式替换:

new Regex("\b(?!my|test)\w+\s?").Replace("Thats my working test", "");

这是regex demo

  • \b在我们要检查之前断言位置。
  • (?!否定前瞻 - 断言我们的匹配是
    • my|test字符序列“我的”或“测试”
  • )
  • \w+然后匹配这个词,因为这就是我们想要的。
  • \s?如果它在那里,也会废弃后面的空格。

答案 2 :(得分:-1)

我建议使用下一个regEx:

var res = new Regex(@"my(?:$|[\s\.;\?\!,])|test(?:$|[\s\.;\?\!,])").Replace("Thats my working test", "");

更新:甚至更简单:

var res = new Regex(@"my($|[\s])|test($|[\s])").Replace("Thats my working test", "");

Upd2:如果你不知道你会用什么词,你可以更灵活地做到:

private string ExeptWords(string input, string[] exept){
   string tmpl = "{0}|[\s]";
   var regexp = string.Join((exept.Select(s => string.Format(tmpl, s)),"|");
   return new Regex(regexp).Replace(("Thats my working test", "");
}