【问题标题】:Replace string only when 100% matched [duplicate]仅在 100% 匹配时替换字符串 [重复]
【发布时间】:2019-02-06 04:22:20
【问题描述】:

只是徘徊,c#.net中100%匹配的情况下怎么才能替换字符串?比如我有如下字符串:

StringBuilder a = new(StringBuilder);     
a = "ABC-1 ABC-1.1 ABC-1.1~1"

我正在使用以下脚本来替换字符串:

a.Replace("ABC-1", "ABC-2");

目前输出如下:

ABC-2 ABC-2.1 ABC-2.1~1

相反,我正在寻找的输出是这样的:

ABC-2 ABC-1.1 ABC-1.1~1

有人知道我该怎么做吗?

【问题讨论】:

  • 是什么让事情变得“完整”?你的意思是'一个单词必须有空格(或者在字符串的开头或结尾) - 我想匹配整个单词'?如果是这样,请使用string.Split。遍历数组并替换数组中完全匹配的条目 (==)。然后string.Join 重新组合在一起。

标签: c# .net


【解决方案1】:

这可能会有所帮助:

var a = "ABC-1 ABC-1.1 ABC-1.1~1";
var result = String.Join(" ", a.Split(' ').Select(x=>x=="ABC-1"? "ABC-2":x));

结果:

"ABC-2 ABC-1.1 ABC-1.1~1"

【讨论】:

    【解决方案2】:

    如果您的输入中没有标点符号来表示单词的结尾,那么链接到的“duplicate”将是一个很好的解决方案。所以该线程中的正则表达式不能按原样工作。

    不过,您应该可以使用negative lookahead

    var a = "ABC-1 ABC-1.1 ABC-1.1~1";
    
    a = Regex.Replace(a, @"\bABC-1\b(?!\S)", "ABC-2");
    
    Console.WriteLine(a);  // ABC-2 ABC-1.1 ABC-1.1~1
    

    它基本上断言搜索词后面的字符不是非空白字符(但如果它是字符串的结尾也匹配)。

    【讨论】:

      【解决方案3】:

      如果您只想替换第一次出现,此方法可以帮助您:

      public static string ReplaceFirst(this string original, string oldValue, string newValue)
      {
          var index = original.IndexOf(oldValue);
          if (index >= 0) {
              var prev = original.Substring(0, index);
              var after = original.Substring(index + oldValue.Length);
              return prev + newValue + after;
          }
          return original;
      }
      

      【讨论】:

        【解决方案4】:

        要匹配确切的单词,请使用正则表达式@"(^|\s)ABC-1.1(\s|$)";

        string a = "ABC-1 ABC-1.1 ABC-1.1~1";
            string pattern  = @"(^|\s)ABC-1.1(\s|$)";
            string replace =  Regex.Replace(a, pattern , " test ");
        
            Console.WriteLine(replace);
        

        输出ABC-1 test ABC-1.1~1

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-11
          • 2011-08-29
          • 2014-08-01
          • 2017-01-18
          • 1970-01-01
          相关资源
          最近更新 更多