替换字符串中第一次出现的模式[重复]

Posted

技术标签:

【中文标题】替换字符串中第一次出现的模式[重复]【英文标题】:Replace first occurrence of pattern in a string [duplicate] 【发布时间】:2012-02-07 05:21:53 【问题描述】:

可能重复:How do I replace the first instance of a string in .NET?

假设我有字符串:

string s = "Hello world.";

我怎样才能将单词Hello 中的第一个o 替换为Foo

换句话说,我想结束:

"HellFoo world."

我知道如何替换所有的 o,但我只想替换第一个

【问题讨论】:

投票重新打开这个老问题,它明确地涉及模式正则表达式。虽然在这种情况下它被简化为文字字符串,但它在技术上与实际询问不同。不幸的是,副本也被标记为“正则表达式”,尽管它在任何地方都没有包含“模式”。 【参考方案1】:

我觉得可以用Regex.Replace的重载来指定最大替换次数……

var regex = new Regex(Regex.Escape("o"));
var newText = regex.Replace("Hello World", "Foo", 1);

【讨论】:

替换的好选择【参考方案2】:
public string ReplaceFirst(string text, string search, string replace)

  int pos = text.IndexOf(search);
  if (pos < 0)
  
    return text;
  
  return text.Substring(0, pos) + replace + text.Substring(pos + search.Length);

这是一个扩展方法,也可以根据VoidKing 请求工作

public static class StringExtensionMethods

    public static string ReplaceFirst(this string text, string search, string replace)
    
      int pos = text.IndexOf(search);
      if (pos < 0)
      
        return text;
      
      return text.Substring(0, pos) + replace + text.Substring(pos + search.Length);
    

【讨论】:

比正则表达式恕我直言要好得多,这就是正则表达式在跳过开销后最终会做的事情。在很长的字符串中,最后的结果很远,正则表达式 impl 可能会更好,因为它支持流式传输 char 数组,但对于小字符串,这似乎更有效......【参考方案3】:

有很多方法可以做到这一点,但最快的可能是使用 IndexOf 找到要替换的字母的索引位置,然后将要替换的文本前后的文本子串出。

if (s.Contains("o"))

    s = s.Remove(s.IndexOf('o')) + "Foo" + s.Substring(s.IndexOf('o') + 1);

【讨论】:

以上是关于替换字符串中第一次出现的模式[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何替换字符串中所有但第一次出现的模式

在mac上使用sed删除文件中第一次出现的字符串[重复]

替换 Python 中第一次出现的字符串

如何替换Java中第一次出现的字符串

字符串替换

使用正则表达式替换重复模式追加