如何修改用 C# 编写的字符串内容

本文演示通过修改现有 string 来生成 string 的几种方法。 演示的所有方法均将修改的结果返回为新的 string 对象。 为了说明原始字符串和修改后的字符串是不同的实例,示例会将结果存储在新变量中。 运行每个示例时,可以检查原始 string 和修改后的新 string

注意

本文中的 C# 示例运行在 Try.NET 内联代码运行程序和演练环境中。 选择“运行”按钮以在交互窗口中运行示例。 执行代码后,可通过再次选择“运行”来修改它并运行已修改的代码。 已修改的代码要么在交互窗口中运行,要么编译失败时,交互窗口将显示所有 C# 编译器错误消息。

本文中演示了几种方法。 你可以替换现有文本。 可以搜索模式并将匹配的文本替换为其他文本。 可以将字符串视为字符序列。 还可以使用删除空格的简便方法。 选择与你的方案最匹配的方法。

替换文本

下面的代码通过将现有文本替换为替代文本来创建新的字符串。

string source = "The mountains are behind the clouds today.";

// Replace one substring with another with String.Replace.
// Only exact matches are supported.
var replacement = source.Replace("mountains", "peaks");
Console.WriteLine($"The source string is <{source}>");
Console.WriteLine($"The updated string is <{replacement}>");

上述代码演示了字符串的不可变属性。 在上述示例中可以看到,原始字符串 source 并未被修改。 String.Replace 方法创建的是包含修改的新 string

Replace 可替换字符串或单个字符。 在这两种情况下,搜索文本的每个匹配项均被替换。 下面的示例将所有的“ ”都替换为“_”:

string source = "The mountains are behind the clouds today.";

// Replace all occurrences of one char with another.
var replacement = source.Replace(' ', '_');
Console.WriteLine(source);
Console.WriteLine(replacement);

源字符串并未发生更改,而是通过替换操作返回了一个新的字符串。

去除空格

可使用 String.TrimString.TrimStartString.TrimEnd 方法删除任何前导空格或尾随空格。 下面的代码就是删除两种空格的示例。 源字符串不会发生变化;这些方法返回带修改内容的新字符串。

// Remove trailing and leading white space.
string source = "    I'm wider than I need to be.      ";
// Store the results in a new string variable.
var trimmedResult = source.Trim();
var trimLeading = source.TrimStart();
var trimTrailing = source.TrimEnd();
Console.WriteLine($"<{source}>");
Console.WriteLine($"<{trimmedResult}>");
Console.WriteLine($"<{trimLeading}>");
Console.WriteLine($"<{trimTrailing}>");

删除文本

可使用 String.Remove 方法删除字符串中的文本。 此方法移删除特定索引处开始的某些字符。 下面的示例演示如何使用 String.IndexOf(后接 Remove)方法,删除字符串中的文本:

string source = "Many mountains are behind many clouds today.";
// Remove a substring from the middle of the string.
string toRemove = "many ";
string result = string.Empty;
int i = source.IndexOf(toRemove);
if (i >= 0)
{
    result= source.Remove(i, toRemove.Length);
}
Console.WriteLine(source);
Console.WriteLine(result);

替换匹配模式

可使用正则表达式将匹配模式的文本替换为新文本,新文本可能由模式定义。 下面的示例使用 System.Text.RegularExpressions.Regex 类从源字符串中查找模式并将其替换为正确的大写。 Regex.Replace(String, String, MatchEvaluator, RegexOptions) 方法使用将替换逻辑提供为其参数之一的函数。 在本示例中,该函数 LocalReplaceMatchCase 是在示例方法中声明的本地函数。 LocalReplaceMatchCase 使用 System.Text.StringBuilder类,以生成具有正确大写的替换字符串。

正则表达式最适合用于搜索和替换遵循模式的文本,而不是已知的文本。 有关详细信息,请参阅如何搜索字符串。 搜索模式“the\s”搜索“the”后接空格字符的单词。 该部分的模式可确保它不与源字符串中的“there”相匹配。 有关正则表达式语言元素的更多信息,请参阅正则表达式语言 - 快速参考

string source = "The mountains are still there behind the clouds today.";

// Use Regex.Replace for more flexibility.
// Replace "the" or "The" with "many" or "Many".
// using System.Text.RegularExpressions
string replaceWith = "many ";
source = System.Text.RegularExpressions.Regex.Replace(source, "the\\s", LocalReplaceMatchCase,
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
Console.WriteLine(source);

string LocalReplaceMatchCase(System.Text.RegularExpressions.Match matchExpression)
{
    // Test whether the match is capitalized
    if (Char.IsUpper(matchExpression.Value[0]))
    {
        // Capitalize the replacement string
        System.Text.StringBuilder replacementBuilder = new System.Text.StringBuilder(replaceWith);
        replacementBuilder[0] = Char.ToUpper(replacementBuilder[0]);
        return replacementBuilder.ToString();
    }
    else
    {
        return replaceWith;
    }
}

StringBuilder.ToString 方法返回一个不可变的字符串,其中包含 StringBuilder 对象中的内容。

修改单个字符

可从字符串生成字符数组,修改数组的内容,然后从数组的已修改内容创建新的字符串。

下面的示例演示如何替换字符串中的一组字符。 首先,它使用 String.ToCharArray() 方法来创建字符数组。 它使用 IndexOf 方法来查找单词“fox”的起始索引。接下来的三个字符将替换为其他单词。 最终,从更新的字符串数组中构造了新的字符串。

string phrase = "The quick brown fox jumps over the fence";
Console.WriteLine(phrase);

char[] phraseAsChars = phrase.ToCharArray();
int animalIndex = phrase.IndexOf("fox");
if (animalIndex != -1)
{
    phraseAsChars[animalIndex++] = 'c';
    phraseAsChars[animalIndex++] = 'a';
    phraseAsChars[animalIndex] = 't';
}

string updatedPhrase = new string(phraseAsChars);
Console.WriteLine(updatedPhrase);

以编程方式生成字符串内容

由于字符串是不可变的,因此前面的示例都创建了临时字符串或字符数组。 在高性能方案中,可能需要避免这些堆分配。 .NET Core 提供了一种 String.Create 方法,该方法使你可以通过回调以编程方式填充字符串的字符内容,同时避免中间的临时字符串分配。

// constructing a string from a char array, prefix it with some additional characters
char[] chars = { 'a', 'b', 'c', 'd', '\0' };
int length = chars.Length + 2;
string result = string.Create(length, chars, (Span<char> strContent, char[] charArray) =>
{
    strContent[0] = '0';
    strContent[1] = '1';
    for (int i = 0; i < charArray.Length; i++)
    {
        strContent[i + 2] = charArray[i];
    }
});

Console.WriteLine(result);

可以使用不安全的代码修改固定块中的字符串,但是强烈建议不要在创建字符串后修改字符串内容。 这样做将以不可预知的方式中断操作。 例如,如果某人暂存一个与你的内容相同的字符串,他们将获得你的副本,并且不希望你修改他们的字符串。

请参阅