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

Ton*_*Nam 137 c# regex

可能重复:
如何在.NET中替换字符串的第一个实例

假设我有字符串:

string s = "Hello world.";
Run Code Online (Sandbox Code Playgroud)

我怎么能替换第一个o在这个词Hello的假设Foo

换句话说,我想最终得到:

"HellFoo world."
Run Code Online (Sandbox Code Playgroud)

我知道如何更换所有o,但我想更换第一个

Red*_*dog 211

我想你可以使用Regex.Replace的重载来指定要替换的最大次数......

var regex = new Regex(Regex.Escape("o"));
var newText = regex.Replace("Hello World", "Foo", 1);
Run Code Online (Sandbox Code Playgroud)

  • 只是注意:如果被搜索的字符串可以被解释为正则表达式,这是危险的(例如:搜索字符串"(会议"将引发错误,因为它被解释为不完整的正则表达式... (10认同)
  • @JFTxJ - 好点!在Regex构造函数的参数上使用Regex.Escape应该有帮助.相应编辑的例子. (10认同)
  • 对于简单的操作,RegEx似乎是很多开销 (4认同)
  • 我在繁重的循环中使用了这种代码,它消耗了大量的CPU和内存.在这种循环中必须避免它. (3认同)
  • Regex 使用了大量 CPU,这在这种情况下是不必要的。如果考虑性能,请考虑下面使用 IndexOf 的解决方案。 (3认同)
  • AAAA级!好点子!我不知道那是不存在的!谢谢,这将是非常有用的!:-) (2认同)

Met*_*Man 171

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);
}
Run Code Online (Sandbox Code Playgroud)

这是一个扩展方法,也可以按照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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 比正则表达式imho要好得多,这就是正则表达式在跳过开销后最终会做的事情.在结尾很远的非常长的字符串中,正则表达式impl可能更好,因为它支持流式传输char数组,但对于小字符串,这看起来效率更高...... (8认同)
  • @Fattie 愿意解释一下为什么吗? (5认同)
  • @VoidKing更好的是:将其作为扩展. (4认同)
  • 在我看来,这种方法比接受的答案要好.它更快(测试)和很多"更好".我不认为正则表达式很糟糕,但这很容易使用正则表达式.正则表达式为这样简单的任务增加了很多开销. (4认同)
  • 这非常好,谢谢! (3认同)
  • 您可能必须为此方法添加“静态”。即使没有创建类的实例,静态方法、字段、属性或事件也可以在类上调用。对我来说,这对我是否可以使用 C#.NET WebPages 从我的 .cshtml 页面调用包含在我的 .cs 文件中的这个方法产生了影响。这是因为我的班级也是静态的。我也更喜欢这种方法而不是接受的答案。 (2认同)

Mit*_*ers 11

您可以通过多种方式执行此操作,但最快的方法可能是使用IndexOf查找要替换的字母的索引位置,然后在要替换的内容之前和之后对文本进行子字符串输出.

  • @KeachyPeenReturns 为什么只讨论答案而不在这里提供答案? (2认同)