【问题标题】:C# Replace everything except two casesC# 替换除两种情况外的所有内容
【发布时间】:2014-10-07 17:49:34
【问题描述】:

我怎么能做这样的事情。

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

我会得到这个:

my test

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

提前感谢您!

【问题讨论】:

  • 为什么要使用正则表达式?您在寻找一种模式或特定的已知单词吗?
  • 对 String.Replace 的两个简单调用就足够了。
  • 出了点问题。除了两种情况(我猜这些情况是mytest)之外,你想替换所有的东西。所以输出应该是my test。我错过了什么?
  • 它失败了,因为[^my] 的意思不是“不是'my'这个词”,而是“除了'm'或'y'之外的任何字符”
  • 示例错误。对不起。我将替换除 my 和 test 之外的所有内容,以便我得到 my test

标签: c# regex regex-negation


【解决方案1】:

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

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

//=> my test

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

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

RegEx Demo

【讨论】:

  • 啊,谢谢。但我的例子是错误的。我的意思是这个结果:“我的测试”。我会替换除“我的”和“测试”之外的所有内容。这就是计划。我可以改用(my|test),但这是错误的。不过谢谢!
【解决方案2】:

使用这个正则表达式替换:

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

这是regex demo

  • \b 在我们要检查的单词之前断言位置。
  • (?! Negative lookahead - 断言我们的匹配是NOT
    • my|test 字符序列“my”或“test”
  • )
  • \w+ 然后匹配这个词,因为它是我们想要的。
  • \s? 并且如果它后面的空白也存在,则将其废弃。

【讨论】:

    【解决方案3】:

    我可以建议使用下一个正则表达式:

    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", "");
    }
    

    【讨论】:

      猜你喜欢
      • 2013-12-26
      • 2017-08-26
      • 2021-11-27
      • 2015-12-02
      • 2017-04-06
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多