C#字符串与正则表达式详解
C#中的字符串操作是开发中最基础也最常用的功能之一。本文系统梳理了`string`类型的核心属性与方法,并重点讲解如何利用`StringBuilder`优化性能,最后通过大量实例演示正则表达式在文本检索、匹配、替换及验证中的实际应用。
1. 字符串的基础操作
在C#中,`string`类型用于表示文本序列。以下介绍其创建、属性及基本运算方式。
第1步:创建并输出字符串变量
目的:学习如何声明和初始化一个字符串。
操作:使用关键字`string`声明变量,并赋予双引号包裹的内容。
string str = "abcdrf"; Console.WriteLine(str);
第2步:获取字符串长度
目的:读取字符串中包含的字符数量。
操作:调用.Length属性。注意这是一个属性而非方法,因此无需括号。
string str = "abcdrf"; int len = str.Length; Console.WriteLine(len); // 输出 6
第3步:比较、连接与索引访问
目的:掌握判断相等性、拼接内容及定位特定字符的方法。
- 比较:直接使用
==运算符判断内容是否一致。 - 连接:使用
+运算符。若两侧为字符串数字,结果为拼接而非算术加法(如 "1" + "2" = "12")。 - 索引:可将字符串视为只读数组,使用
str[索引]获取指定位置的字符。
第4步:理解字符串的不可变性
目的:明确内存管理机制,避免低效操作。
C#的string是不可变的。每次对字符串进行“修改”(如拼接),实际上是在内存堆中创建一个全新的字符串对象,旧对象仍存在于内存中等待垃圾回收。这种机制在高频修改场景下会导致严重的性能损耗。
2. 常用内置方法大全
string类提供了丰富的API来处理文本。以下是对关键方法的代码实战演示:
第5步:内容处理与格式化
入口:System.String 静态或实例方法。
string str = "ABCDEF";
// 1. CompareTo: 比较两个字符串。返回0表示相等,负数小于,正数大于。
string b = "ABCDEF";
Console.WriteLine(str.CompareTo(b)); // 输出 0
// 2. Replace: 替换子串。返回新字符串,原字符串不变。
string replaced = str.Replace("A", "Z");
// 3. Split: 按分隔符拆分为数组。
string[] parts = "a,b,c".Split(',');
// 4. Substring: 截取子串,从指定索引开始到末尾。
Console.WriteLine(str.Substring(3)); // 输出 DEF
// 5 & 6. ToLower / ToUpper: 转换大小写。
Console.WriteLine(str.ToLower());
// 7. Trim: 移除首尾空白字符。
string trimmed = " hello ".Trim();
// 8. Concat: 静态方法合并多个字符串。
Console.WriteLine(string.Concat("a","b","c"));
// 9. CopyTo: 将字符串的部分字符复制到字符数组中。
char[] arr = new char[10];
str.CopyTo(0, arr, 0, 3);
// 10. Format: 格式化占位符字符串。
Console.WriteLine(string.Format("{0} + {1} = {2}", 1, 2, 3));
// 11. IndexOf: 查找字符首次出现的位置,未找到返回 -1。
Console.WriteLine(str.IndexOf('B')); // 输出 1
// 12. IndexOfAny: 查找一组字符中任意一个第一次出现的位置。
Console.WriteLine(str.IndexOfAny(new char[]{'D', 'F'})); // 输出 3
// 13. Insert: 在指定索引处插入子串。
Console.WriteLine(str.Insert(3, "-X-")); // ABC-X-DEF
// 14. Join: 将字符串数组用分隔符连接。
string joined = string.Join("-", new string[]{"a","b","c"}); // a-b-c
3. 高性能字符串修改:StringBuilder
针对上述提到的“字符串不可变”导致的性能问题,C#提供了 System.Text.StringBuilder 类。它在预分配的内存缓冲区上进行增删改查,极大提升了字符串频繁修改时的效率。
第6步:初始化与增删改查
using System.Text;
// 初始化:可传入初始字符串或容量
StringBuilder sb = new StringBuilder("123456");
// Append: 在末尾追加
sb.Append("abc"); // 结果: 123456abc
// Insert: 在指定索引前插入
sb.Insert(3, "XYZ"); // 结果: 123XYZ456abc
// Remove: 从指定位置移除指定长度的字符
sb.Remove(3, 3); // 结果: 123456abc (移除了XYZ)
// Replace: 替换指定子串
sb.Replace("abc", "XYZ"); // 结果: 123456XYZ对比结论:string适用于少量且不变的文本;当循环内需要拼接字符串或进行大量文本编辑时,务必使用 StringBuilder,因为它避免了反复在托管堆中分配内存。
4. 正则表达式实战详解
正则表达式(Regular Expression)是一种强大的文本处理语言,主要用于:
1. 检索:从杂乱文本中提取特定信息。
2. 匹配:校验输入是否符合规则(如密码强度)。
3. 替换/拆分:根据模式批量处理文本。
第7步:基础元字符与匹配逻辑
在C#中,需引入 System.Text.RegularExpressions 命名空间。以下是核心测试案例:
- 基本字符类:
\d:匹配数字(等价于[0-9])。\w:匹配字母、数字、下划线(等价于[a-zA-Z0-9_])。*:前面的元素出现 0 次或多次。
- 锚点:
^:匹配字符串开头。$:匹配字符串结尾。
- 集合:
[abc]:匹配包含在方括号内的任意一个字符。[a-z]:范围匹配。[^c-j]:异或,匹配不在范围内的字符。
第8步:综合应用示例
using System.Text.RegularExpressions;
string text = "Name: 张三, Age: 25";
// 1. IsMatch: 简单布尔验证
bool hasDigit = Regex.IsMatch("abc123", @"\d");
// 2. ^ 和 $ 组合确保整体格式
// 要求:纯数字,且长度为 5 到 12 位
string pattern = @"^\d{5,12}$";
bool isValid = Regex.IsMatch("1234567", pattern);
// 3. Matches: 提取所有匹配项
MatchCollection matches = Regex.Matches(text, @"[a-zA-Z]+:");
foreach(Match m in matches) {
Console.WriteLine(m.Value); // 输出 Name:, Age:
}
// 4. Replace: 全局替换
// 将所有数字替换为星号
string result = Regex.Replace(text, @"\d", "*");
// 5. Split: 基于正则拆分
string[] fields = Regex.Split(text, @",?");
// 6. 择一匹配 (或 关系)
bool isNumOrLetter = Regex.IsMatch("5", @"\d|[a-z]");
// 7. 分组与量词
// 匹配连续出现的ab
bool isGrouped = Regex.IsMatch("abab", @"(ab){2}");第9步:常见场景总结
合法标识名检查:通常要求以字母或下划线开头,后续由字母、数字或下划线组成。正则写法通常为 @"^[a-zA-Z_][a-zA-Z0-9_]*$"。
数据清洗:利用 Regex.Replace 去除多余空格或非标准字符。
表单验证:在前端提交前或后端接收时,利用 IsMatch 快速拦截非法输入。
总结
掌握C#字符串操作是提升代码健壮性的第一步。理解 string 的不可变性有助于我们在适当时候切换至 StringBuilder 以获得最佳性能。而正则表达式则是处理复杂文本规则的瑞士军刀,建议在实际项目中多查阅文档并结合测试工具熟悉各种元字符的组合用法。
以上就是C#字符串与正则表达式的详细内容,更多关于C#正则表达式验证的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













