如何在.NET中替换字符串的* first instance *?

时间:2008-09-26 18:10:23

标签: c# .net regex string replace

我想替换给定字符串中的第一个匹配项。

如何在.NET中完成此操作?

14 个答案:

答案 0 :(得分:124)

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

示例:

string str = "The brown brown fox jumps over the lazy dog";

str = ReplaceFirst(str, "brown", "quick");

编辑:作为@itsmatt mentioned,还有Regex.Replace(String,String,Int32),它可以做同样的事情,但在运行时可能更贵,因为它是利用我的方法找到的全功能解析器和三个字符串连接。

EDIT2 :如果这是一项常见任务,您可能希望将该方法设为扩展方法:

public static class StringExtension
{
  public static string ReplaceFirst(this string text, string search, string replace)
  {
     // ...same as above...
  }
}

使用上面的例子,现在可以写:

str = str.ReplaceFirst("brown", "quick");

答案 1 :(得分:57)

as itsmatt 表示Regex.Replace是一个很好的选择,但为了使他的答案更加完整,我将用代码示例填写:

using System.Text.RegularExpressions;
...
Regex regex = new Regex("foo");
string result = regex.Replace("foo1 foo2 foo3 foo4", "bar", 1);             
// result = "bar1 foo2 foo3 foo4"

第三个参数,在这种情况下设置为1,是要从字符串开头在输入字符串中替换的正则表达式模式的出现次数。

我希望这可以通过静态Regex.Replace重载完成,但不幸的是,您需要一个Regex实例来完成它。

答案 2 :(得分:16)

看看Regex.Replace

答案 3 :(得分:15)

考虑到“仅限第一”,或许:

int index = input.IndexOf("AA");
if (index >= 0) output = input.Substring(0, index) + "XQ" +
     input.Substring(index + 2);

或更一般地说:

public static string ReplaceFirstInstance(this string source,
    string find, string replace)
{
    int index = source.IndexOf(find);
    return index < 0 ? source : source.Substring(0, index) + replace +
         source.Substring(index + find.Length);
}

然后:

string output = input.ReplaceFirstInstance("AA", "XQ");

答案 4 :(得分:9)

using System.Text.RegularExpressions;

RegEx MyRegEx = new RegEx("F");
string result = MyRegex.Replace(InputString, "R", 1);

会在F中找到第一个InputString,并将其替换为R

答案 5 :(得分:8)

在C#语法中:

int loc = original.IndexOf(oldValue);
if( loc < 0 ) {
    return original;
}
return original.Remove(loc, oldValue.Length).Insert(loc, newValue);

答案 6 :(得分:8)

C#扩展方法将执行此操作:

public static class StringExt
{
    public static string ReplaceFirstOccurrence(this string s, string oldValue, string newValue)
    {
         int i = s.IndexOf(oldValue);
         return s.Remove(i, oldValue.Length).Insert(i, newValue);    
    } 
}

享受

答案 7 :(得分:4)

因为还有VB.NET需要考虑,我想提供:

Private Function ReplaceFirst(ByVal text As String, ByVal search As String, ByVal replace As String) As String
    Dim pos As Integer = text.IndexOf(search)
    If pos >= 0 Then
        Return text.Substring(0, pos) + replace + text.Substring(pos + search.Length)
    End If
    Return text 
End Function

答案 8 :(得分:4)

假设AA只需要替换它,如果它位于字符串的最开头:

var newString;
if(myString.StartsWith("AA"))
{
  newString ="XQ" + myString.Substring(2);
}

如果您需要替换第一次出现的AA,无论字符串是否以字符串开头,请使用Marc的解决方案。

答案 9 :(得分:3)

Regex.Replace的一个重载需要int表示“替换可能发生的最大次数”。显然,使用Regex.Replace进行纯文本替换可能看起来有些过分,但它当然简洁:

string output = (new Regex("AA")).Replace(input, "XQ", 1);

答案 10 :(得分:2)

对于那些不介意Microsoft.VisualBasic引用的人,有Replace Method

string result = Microsoft.VisualBasic.Strings.Replace("111", "1", "0", 2, 1); // "101"

答案 11 :(得分:0)

这个例子抽象出了子串(但速度较慢),但可能比RegEx快得多:

var parts = contents.ToString().Split(new string[] { "needle" }, 2, StringSplitOptions.None);
return parts[0] + "replacement" + parts[1];

答案 12 :(得分:0)

使用Span更新了扩展方法,以最大程度地减少新字符串的创建

    public static string ReplaceFirstOccurrence(this string source, string search, string replace) {
        int index = source.IndexOf(search);
        if (index < 0) return source;
        var sourceSpan = source.AsSpan();
        return string.Concat(sourceSpan.Slice(0, index), replace, sourceSpan.Slice(index + search.Length));
    }

答案 13 :(得分:-1)

string abc = "AAAAX1";

            if(abc.IndexOf("AA") == 0)
            {
                abc.Remove(0, 2);
                abc = "XQ" + abc;
            }