我在 StringBuilder 对象中有一大段文本。我需要用另一个替换一个子字符串。StringBuilder Replace 方法可以做到这一点,但它会替换子字符串的每个实例,我只想替换第一个找到的实例。有没有办法告诉 StringBuilder 只做一次替换?
我确定我可以自己编写代码,我只是想知道是否有一种内置的方式来实现我目前缺少的这一点。
我在 StringBuilder 对象中有一大段文本。我需要用另一个替换一个子字符串。StringBuilder Replace 方法可以做到这一点,但它会替换子字符串的每个实例,我只想替换第一个找到的实例。有没有办法告诉 StringBuilder 只做一次替换?
我确定我可以自己编写代码,我只是想知道是否有一种内置的方式来实现我目前缺少的这一点。
是的,但不是直接的。四个重载中的两个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
这是执行此操作的不同方式,但工作正常
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");
}
如果您知道要替换的子字符串的位置(可能通过使用 IndexOf),您可以使用 StringBuilder 的替换的重载。
public StringBuilder Replace(char oldChar,char newChar,int startIndex,int count);
这是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;
}
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;
}