StringBuilder可以替换一个实例吗?

时间:2010-03-02 15:21:46

标签: .net stringbuilder

我在StringBuilder对象中有一大块文本。我需要用另一个子串替换一个子串。 StringBuilder Replace方法可以做到这一点,但它取代了子串的每个实例,我只想替换第一个找到的实例。有没有办法告诉StringBuilder只做一次替换?

我确信我可以自己编写代码,我只是想知道是否有一种内置的方法来实现这一点,我目前正在缺席。

5 个答案:

答案 0 :(得分:3)

是的,但不是直接的。 Replace的四个重载中有两个处理StringBuilder内容的子字符串,但是您需要找到第一个匹配项的位置才能工作。

这是你想要的那个:
http://msdn.microsoft.com/en-us/library/y1bxd041.aspx

编辑:不幸的是,如果没有在ToString上调用StringBuilder,我找不到找到第一个匹配项的方法。

(抱歉VB,我打开了一个VB项目。)

Dim orig As String = "abcdefgabcdefg"
Dim search As String = "d"
Dim replace As String = "ZZZ"
Dim sb As New StringBuilder(orig)

Dim firstOccurrence = sb.ToString().IndexOf(search)

If firstOccurrence > -1 Then
    sb.Replace(search, replace, firstOccurrence, search.Length)
End If

答案 1 :(得分:1)

这是做到这一点的不同方式,但工作正常

        StringBuilder sb = new StringBuilder("OldStringOldWay");

        int index = sb.ToString().IndexOf("New");           

        sb.Remove(index, "Old".Length);
        sb.Insert(index, "New");

另一种方法可能是使用扩展方法

public static StringBuilder ReplaceOnce
             (this StringBuilder sb, string toReplace, string replaceWith)
     {
       int index = sb.ToString().IndexOf("New");
       sb.Remove(index, "Old".Length);
       sb.Insert(index, "New");
       return sb;
     }

按以下方式调用ReplaceOnce

static void Main(string[] args)
{
   StringBuilder sb = new StringBuilder("OldStringOldWay");
   sb.ReplaceOnce("Old", "New");
}

答案 2 :(得分:0)

如果您知道要替换的子字符串的位置(可能使用IndexOf),您可以使用StringBuilder的替换重载。

public StringBuilder Replace(char oldChar,char newChar,int startIndex,int count);

答案 3 :(得分:0)

这是我很久以前创建的IndexOf方法:)。

/// <summary>
/// Gets the index of a string from a given index with case option
/// </summary>
/// <param name="sb"></param>
/// <param name="text"></param>
/// <param name="startIndex"></param>
/// <param name="ignoreCase"></param>
/// <returns></returns>
public static int IndexOf(this StringBuilder sb, string value, int startIndex, bool ignoreCase)
{
    int num3;
    int length = value.Length;
    int num2 = (sb.Length - length) + 1;

    if (ignoreCase == false)
    {
        for (int i = startIndex; i < num2; i++)
        {
            if (sb[i] == value[0])
            {
                num3 = 1;

                while ((num3 < length) && (sb[i + num3] == value[num3]))
                {
                    num3++;
                }

                if (num3 == length)
                {
                    return i;
                }
            }
        }
    }
    else
    {
        for (int j = startIndex; j < num2; j++)
        {
            if (char.ToLower(sb[j]) == char.ToLower(value[0]))
            {
                num3 = 1;

                while ((num3 < length) && (char.ToLower(sb[j + num3]) == char.ToLower(value[num3])))
                {
                    num3++;
                }

                if (num3 == length)
                {
                    return j;
                }
            }
        }
    }

    return -1;
}

答案 4 :(得分:0)

Asad作品中的另一个工作版本。

public static string ReplaceOnce(this string source, string toReplace, string replaceWith)
{
    int index = source.IndexOf(toReplace);
    if(index != -1)
    {
        source.Remove(index, toReplace.Length);
        source.Insert(index, replaceWith);
    }
    return source;
}