3

StringBuilder オブジェクトにテキストのチャンクがあります。ある部分文字列を別の部分文字列に置き換える必要があります。StringBuilder の Replace メソッドでこれを行うことができますが、部分文字列のすべてのインスタンスが置き換えられるため、最初に見つかったインスタンスのみを置き換えたいと考えています。StringBuilder に 1 つの置換のみを行うように指示する方法はありますか?

私はこれを自分でコーディングできると確信しています。現在欠けているこれを達成するための組み込みの方法があるかどうか疑問に思っています。

4

5 に答える 5

3

はい、直接ではありません。4 つのオーバーロードのうちの 2 つはReplace、コンテンツの部分文字列に対して機能しStringBuilderますが、それが機能するには、最初に出現する位置を見つける必要があります。

必要なものは次のとおりです:
http://msdn.microsoft.com/en-us/library/y1bxd041.aspx

編集: 残念ながらToStringStringBuilder.

(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
于 2010-03-02T15:25:19.450 に答える
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");
}
于 2010-03-02T15:40:24.533 に答える
0

置換する部分文字列の場所がわかっている場合 (おそらく IndexOf を使用して)、StringBuilder の置換のオーバーロードを使用できます。

public StringBuilder Replace(char oldChar,char newChar,int startIndex,int count);
于 2010-03-02T15:25:51.757 に答える
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;
}
于 2014-03-12T15:00:10.110 に答える