【C#】String字符串常用处理方法
1. 声明
Str:自定义变量名
String/string:系统定义
代码:均放在Main函数内
2. 字符串格式化
2.1. 传统格式化方式:简单拼接
1 string name = "GYH"; 2 string message = "Hello, " + name + "!"; 3 Console.WriteLine(message);
2.2. String.Format方法
1 string name = "GYH"; 2 string message = String.Format("Hello,{0}!", name); 3 Console.WriteLine(message);
在格式化字符串中,{0} 是一个占位符,表示第一个参数,{1} 是第二个参数,以此类推。
2.3. 复合格式化
String.Format 也支持复合格式化,允许你指定类型、格式等。
1 int number = 15; 2 string message = String.Format("该数的十六进制形式为: {0:X}.", number); 3 Console.WriteLine(message); //X:十六进制形式输出,以此类推
2.4. 字符串插值
C# 6.0 引入了字符串插值,这是一种更简洁的字符串格式化方法。
在字符串插值中,直接将变量名放在花括号 {} 中即可。
1 string name = "GYH"; 2 string message = $"Hello, {name}!"; 3 Console.WriteLine(message);
2.5. 表达式插值
字符串插值也支持表达式,这意味着你可以在插值表达式中执行简单的计算。
1 int a = 5; 2 int b = 10; 3 string result = $"{a} + {b} = {a + b}."; 4 Console.WriteLine(result);
3. 字符串长度
3.1. 常规判断
1 string text = "Hello World!"; 2 int length = text.Length; 3 Console.WriteLine("String length: " + length);
3.2. 判空
- String.IsNullOrEmpty():检查一个字符串是否为null或者空字符串("")
- String.IsNullOrWhiteSpace():检查字符串是否为空白(空格)
1 // 检查一个字符串是否为null或者空字符串("") 2 string text = null; 3 if (string.IsNullOrEmpty(text)) 4 { 5 Console.WriteLine("字符串为null或空"); 6 } 7 else 8 { 9 Console.WriteLine("字符串长度:: " + text.Length); 10 } 11 12 // 检查字符串是否为空格 13 string text = " "; 14 if (string.IsNullOrWhiteSpace(text)) 15 { 16 Console.WriteLine("字符串为null或空或只包含空格"); 17 } 18 else 19 { 20 Console.WriteLine("字符串长度: " + text.Length); 21 }
4. 字符串拼接
4.1. 使用 + 运算符
1 string Str1 = "Hello"; 2 string Str2 = "World"; 3 string Res = Str1 + " " + Str2 + "!"; 4 Console.WriteLine(Res);
4.2. 使用 String.Concat 方法
1 string Str1 = "Hello"; 2 string Str2 = "World"; 3 string Res = String.Concat(Str1, " ", Str2, "!"); 4 Console.WriteLine(Res);
4.3. 使用 StringBuilder 类
1 StringBuilder sb = new StringBuilder(); 2 sb.Append("Hello"); 3 sb.Append(" "); 4 sb.Append("World"); 5 sb.Append("!"); 6 string Res = sb.ToString(); 7 Console.WriteLine(Res);
4.4. 使用 String.Join 方法
如果你有一个字符串数组或集合,并且想要将它们拼接成一个单独的字符串,可以使用 String.Join 方法。
1 string[] parts = { "I", "am", "a", "boy", "!" }; 2 string result = string.Join(" ", parts); 3 Console.WriteLine(result);
4.5. 使用 String.Format 方法
参考上文“字符串格式化”。
4.6. 使用字符串插值
参考上文“字符串格式化”。
5. 字符串清空
5.1. 赋值为空值
1 string myString = "Hello, World!"; 2 myString = ""; 3 Console.WriteLine(myString);
如果你的目的是重置一个字符串变量,并且想要确保它不会占用内存,仅仅赋值为空字符串是不够的,因为字符串在C#中是不可变的。如果你确实需要释放一个字符串变量占用的内存,你可以将变量设置为 null,释放内存。
1 string myString = "Hello, World!"; 2 myString = null;
请注意,将字符串设置为 null 后,尝试访问它将会导致 NullReferenceException 异常。因此,在使用之前,你需要确保字符串不是 null。
5.2. 使用 StringBuilder.Clear 方法
C#本身的String不支持使用Clear()方法,但是C#支持的StringBuilder对象可支持该函数。
1 StringBuilder sb = new StringBuilder(); 2 sb.Append("Hello, World!"); 3 Console.WriteLine(sb); 4 sb.Clear(); 5 Console.WriteLine(sb);
6. 字符串索引
6.1. 使用 [index] 运算符
1 string text = "Hello, World!"; 2 char ch = text[7]; 3 Console.WriteLine(ch); // 输出: W
6.2. this 索引器
1 string text = "Hello, World!"; 2 char character = text[7]; 3 char characterWithThis = text.this[7]; 4 Console.WriteLine(character); // 输出: W 5 Console.WriteLine(characterWithThis); // 输出: W
注意:
this 索引器在 C# 8.0 及以后的版本中是字符串结构的一部分,所以它只在支持 C# 8.0 或更新版本的环境里有效。在旧版本的 C# 中,你只能使用标准的下标索引器 [] 来访问字符串中的字符。
7. 字符串定位:IndexOf()方法
指定子字符串在原始字符串中第一次出现的索引位置,可以使用String.IndexOf() 方法。这个方法返回子字符串在原始字符串中首次出现的索引位置;如果没有找到,则返回-1。
1 string Str = "Hello, World! Welcome to the World of C#."; 2 string sub= "World"; 3 4 int index = Str.IndexOf(sub); 5 6 if (index != -1) 7 { 8 Console.WriteLine($"The substring '{sub}' is found at index: {index}"); 9 } 10 else 11 { 12 Console.WriteLine($"The substring '{sub}' was not found in the original string."); 13 }
此外,IndexOf方法还有几个重载版本,以下为常规重载方法:
int IndexOf(string value)
- 查找 value 在字符串中的第一次出现,并返回子字符串的第一个字符的索引位置。
int IndexOf(string value, int startIndex)
- 从 startIndex 开始,查找 value 在字符串中的第一次出现,并返回子字符串的第一个字符的索引位置。
int IndexOf(string value, int startIndex, int count)
- 从 startIndex 开始,只搜索 count 个字符,然后查找 value 在字符串中的第一次出现,并返回子字符串的第一个字符的索引位置。
int IndexOf(char value)
- 查找字符 value 在字符串中的第一次出现,并返回该字符的索引位置。
int IndexOf(char value, int startIndex)
- 从 startIndex 开始,查找字符 value 在字符串中的第一次出现,并返回该字符的索引位置。
int IndexOf(char value, int startIndex, int count)
- 从 startIndex 开始,只搜索 count 个字符,然后查找字符 value 在字符串中的第一次出现,并返回该字符的索引位置。
int IndexOf(string value, int startIndex, StringComparison comparisonType)
- 从 startIndex 开始,使用指定的 comparisonType 查找 value 在字符串中的第一次出现,并返回子字符串的第一个字符的索引位置。
int IndexOf(string value, int startIndex, int count, StringComparison comparisonType)
- 从 startIndex 开始,只搜索 count 个字符,并使用指定的 comparisonType 查找 value 在字符串中的第一次出现,并返回子字符串的第一个字符的索引位置。
StringComparison 是一个枚举,定义了不同的字符串比较选项,如:
- CurrentCulture:根据当前文化的非大小写敏感比较。
- CurrentCultureIgnoreCase:根据当前文化的非大小写敏感比较。
- InvariantCulture:根据非大小写敏感的不变文化比较。
- InvariantCultureIgnoreCase:根据不变文化的非大小写敏感比较。
- Ordinal:执行非大小写敏感的比较,使用字符的排序值。
- OrdinalIgnoreCase:执行基于字符排序值的非大小写敏感比较。
8. 比较两个字符串
8.1. == 和 != 运算符
1 string str1 = "Hello"; 2 string str2 = "Hello"; 3 bool areEqual = str1 == str2; // 返回 true 4 bool areNotEqual = str1 != str2; // 返回 false
8.2. String.Equals 方法
String.Equals 方法可以比较两个字符串是否相等,并且允许你指定一种 StringComparison 枚举类型的比较方式。
1 string str1 = "Hello"; 2 string str2 = "hello"; 3 bool areEqualOrdinal = str1.Equals(str2, StringComparison.Ordinal); // 默认为Ordinal,区分大小写,返回 false 4 bool areEqualIgnoreCase = str1.Equals(str2, StringComparison.OrdinalIgnoreCase); // 不区分大小写,返回 true
8.3. String.Compare 方法
String.Compare 方法可以比较两个字符串,并且返回一个整数,表示一个字符串在排序顺序中的相对位置。
1 string str1 = "Hello"; 2 string str2 = "hello"; 3 int result = String.Compare(str1, str2); 4 5 if (result < 0) 6 { 7 // str1 小于 str2 8 } 9 else if (result > 0) 10 { 11 // str1 大于 str2 12 } 13 else 14 { 15 // str1 等于 str2 16 }
String.Compare 方法也有重载版本,允许你指定 StringComparison 枚举类型的比较方式。
8.4. String.CompareOrdinal 方法
String.CompareOrdinal 是一个比较两个字符串的简单方法,它基于字符的编码值进行比较,区分大小写。
1 string str1 = "Hello"; 2 string str2 = "hello"; 3 int result = string.CompareOrdinal(str1, str2); 4 5 if (result != 0) 6 { 7 // str1 和 str2 不相等 8 } 9 else 10 { 11 // str1 等于 str2 12 }
注意:
- 默认情况下,== 和 != 运算符区分大小写和文化特性。
- String.Equals 和 String.Compare 方法允许你使用 StringComparison 枚举指定不同的比较方式,例如忽略大小写或使用当前文化的规则。
9. 使用默认字符集将字符串变为字节数
在C#中,可以使用System.Text.Encoding类将字符串转换为字节数组。如果你想要使用默认的字符集进行编码(通常是UTF-8或你系统上的默认字符集),可以使用Encoding.Default属性。
1 string text = "Hello, World!"; 2 Encoding encoding = Encoding.Default; // 使用系统默认字符集 3 byte[] bytes = encoding.GetBytes(text); 4 5 // 打印字节数组的内容 6 Console.WriteLine("Byte array from string:"); 7 foreach (byte b in bytes) 8 { 9 Console.Write(b + " "); 10 }
在这个例子中,Encoding.GetBytes方法将字符串转换成字节序列。Encoding.Default通常代表系统默认的字符集,但请注意,如果你的系统配置了特定的默认编码,它可能与UTF-8不同。
编码:UTF-8编码:Encoding utf8Encoding = Encoding.UTF8;
将字节数组转换回字符串,可以使用相应的GetString方法:
1 string newText = encoding.GetString(bytes); 2 Console.WriteLine(newText); // 输出: Hello, World!
10. 字符串转换为字符数组
10.1. 使用 ToCharArray 方法
1 string text = "Hello, World!"; 2 char[] charArray = text.ToCharArray(); 3 4 // 打印字符数组的内容 5 Console.WriteLine("字符数组:"); 6 foreach (char c in charArray) 7 { 8 Console.Write(c + " "); 9 }
10.2. 使用 ToArray 方法
1 string text = "Hello, World!"; 2 char[] charArray = text.ToArray(); 3 4 // 打印字符数组的内容 5 Console.WriteLine("字符数组:"); 6 foreach (char c in charArray) 7 { 8 Console.Write(c + " "); 9 }
11. 字符串截取
11.1. 使用 Substring 方法
1 string text = "Hello, World!"; 2 string sub = text.Substring(7, 5); // 从索引7开始,截取长度为5的字符串 3 Console.WriteLine(sub); // 输出: World
11.2. 使用 this 索引器
1 string text = "Hello, World!"; 2 string sub = text[7..12]; // 从索引7到11的字符串片段 3 Console.WriteLine(sub); // 输出: World
注意:
- Substring 方法要求起始索引小于字符串的长度,且长度必须大于0且小于或等于从起始索引到字符串末尾的剩余长度。否则,将抛出 ArgumentOutOfRangeException。
- 使用 this 索引器的截取方式(范围表达式)要求编译器支持C# 7.0或更高版本。
12. 字符串大小写转换
12.1. ToUpper 方法
ToUpper 方法将字符串中的所有字符转换为大写。默认情况下,它使用当前线程的文化信息来执行大小写转换。
1 string text = "Hello, World!"; 2 string upperText = text.ToUpper(); 3 Console.WriteLine(upperText); // 输出: HELLO, WORLD!
如果你需要使用特定的文化信息进行转换,可以传递一个 CultureInfo 对象作为参数:
1 string text = "Hello, World!"; 2 string upperText = text.ToUpper(CultureInfo.InvariantCulture); 3 Console.WriteLine(upperText); // 输出: HELLO, WORLD!
12.2. ToLower 方法
1 string text = "HELLO, WORLD!"; 2 string lowerText = text.ToLower(); 3 Console.WriteLine(lowerText); // 输出: hello, world!
和 ToUpper 方法一样,你也可以传递一个 CultureInfo 对象:
1 string text = "HELLO, WORLD!"; 2 string lowerText = text.ToLower(CultureInfo.InvariantCulture); 3 Console.WriteLine(lowerText); // 输出: hello, world!
12.3. InvariantCulture 静态属性
使用 InvariantCulture 静态属性可以确保大小写转换不依赖于线程的当前文化设置,而是基于一个固定的、不变文化信息(通常是指英语文化)。
1 string text = "Héllo, Wörld!"; 2 string lowerTextInvariant = text.ToLower(CultureInfo.InvariantCulture); 3 Console.WriteLine(lowerTextInvariant); // 输出: héllo, w?rld!
请注意,某些特殊字符的大小写转换可能会根据文化信息的不同而有所差异。
12.4. ToString 方法
对于数字类型的变量,可以使用 ToString 方法并结合 ToUpper 或 ToLower 来转换数字的字符串表示形式的大小写。
1 int number = 123; 2 string upperNumber = number.ToString().ToUpper(); 3 Console.WriteLine(upperNumber); // 输出: "123"
13. 字符串截取前后空白
在C#中,要截取(去除或修剪)字符串两端的空白,可以使用Trim方法。
Trim方法会移除字符串开头和结尾的所有空白字符,包括空格、制表符、换行符等。
1 string text = " Hello, World! "; 2 string trimmedText = text.Trim(); 3 Console.WriteLine(trimmedText); // 输出: "Hello, World!"
如果只想移除字符串开头的空白,可以使用TrimStart方法:
1 string text = " Hello, World! "; 2 string trimmedText = text.TrimStart(); 3 Console.WriteLine(trimmedText); // 输出: "Hello, World! "
同理,如果只想移除字符串结尾的空白,可以使用TrimEnd方法:
1 string text = " Hello, World! "; 2 string trimmedText = text.TrimEnd(); 3 Console.WriteLine(trimmedText); // 输出: " Hello, World!"
Trim、TrimStart和TrimEnd方法都还有重载版本,允许你指定一组自定义的字符来作为要移除的字符集:
1 string text = "----Hello, World!----"; 2 string trimmedText = text.Trim('-'); 3 Console.WriteLine(trimmedText); // 输出: "Hello, World!"
请注意,所有的Trim方法只会移除字符串两端的空白字符,不会影响字符串中间的空白。如果你需要移除字符串中的所有空白字符,可以使用String.Replace方法将空白字符替换为空字符串。(请往下阅读)
14. 字符串替换
14.1. 使用 Replace 方法
String.Replace 方法可以用来替换字符串中的所有匹配项。它可以替换单个字符或者字符串。
1 string original = "Hello World!"; 2 string modified = original.Replace("World", "Universe"); 3 Console.WriteLine(modified); // 输出: Hello Universe!
如果你想要替换单个字符,可以给 Replace 方法传入单个字符作为参数:
1 string original = "Hello World!"; 2 string modified = original.Replace('W', 'w'); 3 Console.WriteLine(modified); // 输出: hello World!
14.2. 使用 StringBuilder 类
对于大量替换操作,使用 StringBuilder 类可能更高效,因为它是可变的。
1 string original = "Hello World!"; 2 StringBuilder sb = new StringBuilder(original); 3 sb.Replace("World", "Universe"); 4 string modified = sb.ToString(); 5 Console.WriteLine(modified); // 输出: Hello Universe!
14.3. 正则表达式替换
如果你需要更复杂的替换逻辑,比如仅替换匹配正则表达式的项,可以使用 Regex.Replace 方法。
1 string original = "Hello World! Hello Everyone!"; 2 string modified = Regex.Replace(original, "Hello", "Hi"); 3 Console.WriteLine(modified); // 输出: Hi World! Hi Everyone!
注意:
- String.Replace 方法只会替换字符串中的匹配项,不会修改原始字符串,因为字符串在C#中是不可变的。
- 使用 StringBuilder 类的 Replace 方法可以在同一个 StringBuilder 实例上进行多次替换操作,这对于需要频繁修改字符串的场景更为高效。
- Regex.Replace 提供了强大的字符串处理功能,允许你使用正则表达式来定义复杂的替换规则。
15. 字符串分割
15.1. 使用默认分隔符
默认情况下,Split 方法使用空白字符(如空格、制表符、换行符等)作为分隔符。
1 string text = "One Two Three Four"; 2 string[] words = text.Split(); 3 Console.WriteLine(string.Join(", ", words)); // 输出: One, Two, Three, Four
15.2. 使用自定义分隔符
你可以传递一个字符数组作为参数,来指定哪些字符应该用作分隔符。
1 string text = "One,Two,Three,Four"; 2 char[] delimiters = { ',', ' ' }; // 指定逗号和空格作为分隔符 3 string[] words = text.Split(delimiters); 4 Console.WriteLine(string.Join(", ", words)); // 输出: One, Two, Three, Four
15.3. 限制返回子字符串的数量
你可以传递一个额外的参数来限制返回的子字符串的数量。如果分隔符在字符串中出现的次数超过了这个数量限制,那么所有额外的子字符串将被合并到数组的最后一个元素中。
1 string text = "One,Two,Three,Four"; 2 string[] words = text.Split(new char[] { ',', ' ' }, 3); 3 Console.WriteLine(string.Join(", ", words)); // 输出: One, Two, Three,Four
15.4. 使用 StringSplitOptions 枚举
Split 方法的重载版本允许你指定 StringSplitOptions 枚举,它提供了控制字符串分割行为的选项。
- None:默认选项,不忽略任何空白字符。
- RemoveEmptyEntries:忽略结果数组中的空元素。
- TrimEntries:在分割字符串后,移除每个元素的首尾空白字符。
1 string text = " One, Two,Three, , Four "; 2 char[] delimiters = { ',', ' ' }; // 指定逗号和空格作为分隔符 3 string[] words = text.Split(delimiters, StringSplitOptions.RemoveEmptyEntries); 4 Console.WriteLine(string.Join(", ", words)); // 输出: One, Two, Three, Four
在这个例子中,使用 StringSplitOptions.RemoveEmptyEntries 选项忽略掉了空白字符和空字符串。
16. 正则匹配
在C#中,正则表达式匹配可以通过System.Text.RegularExpressions.Regex类来实现。这个类提供了多种方法来处理正则表达式的匹配,以下是一些常用的方法。
16.1. IsMatch 方法
IsMatch方法用于判断输入的字符串是否与正则表达式匹配。如果匹配返回true,否则返回false。
1 string pattern = @"\b\d{3}\b"; // 匹配三个数字的字符串 2 string input = "abc 123 def 456"; 3 bool isMatch = Regex.IsMatch(input, pattern); 4 Console.WriteLine(isMatch); // 输出: True
16.2. Match 方法
Match方法同样用于匹配正则表达式,但它返回一个Match对象,该对象包含了有关匹配的详细信息。
1 string pattern = @"\b\d{3}\b"; // 匹配三个数字的字符串 2 string input = "abc 123 def 456"; 3 Match match = Regex.Match(input, pattern); 4 if (match.Success) 5 { 6 Console.WriteLine(match.Value); // 输出匹配的字符串,这里是 "123" 7 }
16.3. Matches 方法
Matches方法返回一个MatchCollection,它包含了输入字符串中所有匹配正则表达式的项。
1 string pattern = @"\b\d{3}\b"; // 匹配三个数字的字符串 2 string input = "abc 123 def 456"; 3 MatchCollection matches = Regex.Matches(input, pattern); 4 foreach (Match match in matches) 5 { 6 Console.WriteLine(match.Value); // 将输出所有匹配的字符串 7 }
16.4. Replace 方法
Replace方法可以用来替换掉匹配正则表达式的部分。
1 string pattern = @"\b\d{3}\b"; // 匹配三个数字的字符串 2 string input = "abc 123 def 456"; 3 string replacement = "XXX"; 4 string result = Regex.Replace(input, pattern, replacement); 5 Console.WriteLine(result); // 将数字123和456替换为XXX
16.5. 使用 RegexOptions
在执行正则表达式操作时,你还可以指定RegexOptions,以改变匹配的行为。
1 // 忽略大小写 2 Regex.IsMatch(input, pattern, RegexOptions.IgnoreCase);
常见的RegexOptions枚举值包括:
- IgnoreCase:忽略大小写。
- Compiled:编译正则表达式以提高执行效率。
- Singleline:将输入字符串视为单个行,使得^和$匹配整个字符串的开始和结束。
注意:
- 正则表达式是强大的文本处理工具,但也可能引起性能问题,特别是在复杂的表达式或大文本量的情况下。
- 确保正确理解正则表达式的行为,以避免意外匹配或性能瓶颈。
时间:2024年4月28日

【C#】String字符串常用处理方法
浙公网安备 33010602011771号