别人没那么重要,我也没那么重要,好好活着,把能做的小事做好,够不到的东西就放弃,承认就好。做一个心情好能睡着的人,你所有事情都会在正轨上。

【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方法还有几个重载版本,以下为常规重载方法:

  1. int IndexOf(string value)
  • 查找 value 在字符串中的第一次出现,并返回子字符串的第一个字符的索引位置。
  1. int IndexOf(string value, int startIndex)
  • startIndex 开始,查找 value 在字符串中的第一次出现,并返回子字符串的第一个字符的索引位置。
  1. int IndexOf(string value, int startIndex, int count)
  • startIndex 开始,只搜索 count 个字符,然后查找 value 在字符串中的第一次出现,并返回子字符串的第一个字符的索引位置。
  1. int IndexOf(char value)
  • 查找字符 value 在字符串中的第一次出现,并返回该字符的索引位置。
  1. int IndexOf(char value, int startIndex)
  • startIndex 开始,查找字符 value 在字符串中的第一次出现,并返回该字符的索引位置。
  1. int IndexOf(char value, int startIndex, int count)
  • startIndex 开始,只搜索 count 个字符,然后查找字符 value 在字符串中的第一次出现,并返回该字符的索引位置。
  1. int IndexOf(string value, int startIndex, StringComparison comparisonType)
  • startIndex 开始,使用指定的 comparisonType 查找 value 在字符串中的第一次出现,并返回子字符串的第一个字符的索引位置。
  1. 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.EqualsString.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日

posted @ 2024-04-28 16:30  一路狂奔的乌龟  阅读(333)  评论(0)    收藏  举报
返回顶部