2010-03-02 151 views
3

我在StringBuilder對象中有一段文字。我需要用另一個替換一個子字符串。 StringBuilder替換方法可以做到這一點,但它會替換子串的每個實例,我只想替換第一個找到的實例。有沒有辦法告訴StringBuilder只做一個替換?可以StringBuilder替換一個實例嗎?

我敢肯定,我可以自己編碼,我只是想知道是否有內置的方式來實現我目前失蹤。

+0

如果StringBuilder有一個IndexOf方法,那肯定會很好。 – epotter 2010-03-02 15:46:43

回答

3

是的,但不是直接的。 Replace的四個重載中有兩個工作在StringBuilder內容的子字符串上,但是您需要找到第一個出現的位置。

這裏有你想要的:
http://msdn.microsoft.com/en-us/library/y1bxd041.aspx

編輯:不幸的是,我沒有看到一個方法來找到第一個出現而不在StringBuilder調用ToString

(對不起,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
+0

如果你不知道第一個字符串在哪裏,那麼這樣做不起作用。 – 2010-03-02 15:29:19

+0

@Dan:更新後請重新閱讀。 – 2010-03-02 15:30:39

0

如果你知道你要替換的子串的位置(可能使用的IndexOf),您可以使用StringBuilder的過載更換。

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

這種方法面臨的挑戰之一是StringBuilder沒有自己的IndexOf方法。 – epotter 2010-03-02 15:36:08

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"); 
} 
+0

如果我必須快速連續地完成幾個這樣的替換,是否有更有效的方式來查找開始stringToReplace比從StringBuilder創建一個新的String對象? – epotter 2010-03-02 15:46:20

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; 
} 
相關問題