代码之家  ›  专栏  ›  技术社区  ›  Dan Andreatta

StringBuilder可以替换一个实例吗?

  •  3
  • Dan Andreatta  · 技术社区  · 15 年前

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

    我确信我可以自己编写代码,我只是想知道是否有一种内置的方式来实现我目前所缺少的功能。

    4 回复  |  直到 11 年前
        1
  •  3
  •   Jon Seigel    15 年前

    是的,但不是直接的。四个超负荷中的两个 Replace 处理的子字符串 StringBuilder 内容,但您需要找到第一次出现的位置才能工作。

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

    编辑:不幸的是,我找不到不打电话就能找到第一个事件的方法。 ToString 字符串拼接 .

    (抱歉,我有一个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
        2
  •  1
  •   Asad    15 年前

    这是不同的方法,但效果很好

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

    并调用replace一次,如下所示

    static void Main(string[] args)
    {
       StringBuilder sb = new StringBuilder("OldStringOldWay");
       sb.ReplaceOnce("Old", "New");
    }
    
        3
  •  0
  •   NebuSoft    15 年前

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

    public StringBuilder Replace(char oldChar,char newChar,int startIndex,int count);
    
        4
  •  0
  •   Tom Fenech    11 年前

    这里是 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;
    }