-
字符串操作——用C#文本内容替换与提取
第一部分:C#基础入门
实例5:字符串操作——文本内容替换与提取
实例介绍
字符串是开发中最常处理的数据类型之一,从文本清洗到模板生成,从日志分析到用户输入处理,几vb.net教程C#教程python教程SQL教程access 2010教程乎所有场景都离不开字符串操作。本实例通过实现一个文本处理工具,掌握字符串替换、提取的核心技巧:批量替换多关键词、正则提取结构化信息(邮箱/手机号)、处理大小写敏感替换、清洗冗余空格等。你将理解字符串不可变性的本质,学会用正则表达式解决复杂文本问题,为后续Web开发、数据处理打下基础。
需求分析
1.批量替换:支持同时替换多个关键词(如将“C#”→“CSharp”、“Java”→“JavaScript”);
2.正则提取:从任意文本中提取符合规则的邮箱地址、手机号;
3.替换选项:支持大小写敏感/不敏感替换(如替换“apple”时是否匹配“Apple”);
4.文本清洗:去除首尾空格、连续空格合并为单个、转义HTML特殊字符;
5.边界处理:无匹配内容时给出友好提示,处理空文本输入。
代码实现
csharp
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections.Generic;
namespace StringOperationsDemo
{
class TextProcessor
{
static void Main(string[] args)
{
// 1. 输入原始文本
Console.WriteLine("请输入需要处理的文本(按Enter结束):");
string originalText = Console.ReadLine() ?? ""; // 处理null输入
if (string.IsNullOrWhiteSpace(originalText))
{
Console.WriteLine("输入文本为空,无法处理!");
Console.ReadKey();
return;
}
// 2. 定义替换规则(批量替换:关键词→替换值)
Dictionary<string, string> replaceRules = new Dictionary<string, string>
{
{"C#", "CSharp"},
{"Java", "JavaScript"},
{"Python", "Py"},
{" ", " "} // 合并连续空格
};
// 3. 执行批量替换(使用StringBuilder优化性能)
StringBuilder processedText = new StringBuilder(originalText);
foreach (var rule in replaceRules)
{
// 大小写不敏感替换:RegexOptions.IgnoreCase
processedText.Replace(rule.Key, rule.Value);
// 注:若需大小写不敏感,改用正则替换:Regex.Replace(processedText.ToString(), rule.Key, rule.Value, RegexOptions.IgnoreCase)
}
// 4. 清洗文本:去除首尾空格
string cleanedText = processedText.ToString().Trim();
// 5. 正则提取结构化信息(邮箱、手机号)
// 邮箱正则:匹配标准邮箱格式
string emailPattern = @"^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$";
// 手机号正则:匹配中国大陆手机号(1开头,11位)
string phonePattern = @"1[3-9]d{9}";
// 提取邮箱(所有匹配项)
MatchCollection emailMatches = Regex.Matches(cleanedText, emailPattern, RegexOptions.IgnoreCase);
// 提取手机号
MatchCollection phoneMatches = Regex.Matches(cleanedText, phonePattern);
// 6. 输出结果
Console.WriteLine("
===== 处理结果 =====");
Console.WriteLine($"原始文本:{originalText}");
Console.WriteLine($"清洗后文本:{cleanedText}");
Console.WriteLine("
【提取的邮箱地址】");
if (emailMatches.Count == 0)
Console.WriteLine("未找到匹配的邮箱地址");
else
foreach (Match match in emailMatches)
Console.WriteLine(match.Value);
Console.WriteLine("
【提取的手机号】");
if (phoneMatches.Count == 0)
Console.WriteLine("未找到匹配的手机号");
else
foreach (Match match in phoneMatches)
Console.WriteLine(match.Value);
Console.WriteLine("
按任意键退出...");
Console.ReadKey();
}
}
}
逐行讲解
-
输入处理与空值检查
csharp
string originalText = Console.ReadLine() ?? "";
if (string.IsNullOrWhiteSpace(originalText)) { ... }
?? "":空合并运算符,若输入为null则替换为空字符串;
string.IsNullOrWhiteSpace:检查文本是否为null、空或全空格,覆盖所有无效输入场景。
2. 批量替换规则定义
csharp
Dictionary<string, string> replaceRules = new Dictionary<string, string>
{
{"C#", "CSharp"}, {"Java", "JavaScript"}, {" ", " "}
};
用字典存储替换规则,键是待替换关键词,值是替换后内容;
包含“合并连续空格”的规则(将两个空格→一个空格),解决文本冗余问题。
3. 高性能替换:StringBuilder的使用
csharp
StringBuilder processedText = new StringBuilder(originalText);
foreach (var rule in replaceRules) processedText.Replace(rule.Key, rule.Value);
为什么用StringBuilder?:C#字符串是不可变类型,每次string.Replace都会生成新字符串,大量替换时性能极低;
StringBuilder是可变字符序列,直接在原有内存上修改,效率提升10倍以上;
若需大小写不敏感替换,改用正则:Regex.Replace(processedText.ToString(), rule.Key, rule.Value, RegexOptions.IgnoreCase)。
4. 正则提取核心逻辑
csharp
MatchCollection emailMatches = Regex.Matches(cleanedText, emailPattern);
foreach (Match match in emailMatches) Console.WriteLine(match.Value);
Regex.Matches:返回所有匹配正则的结果(MatchCollection);
邮箱正则解析:
^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$
o^w+:以字母/数字/下划线开头;
o([-+.]w+)*:允许包含“-”“+”“.”及后续字符;
o@:必须包含@符号;
o.w+:必须包含域名后缀(如.com);
手机号正则解析:
1[3-9]d{9}
o1:以1开头;
o[3-9]:第二位是3-9(排除1、2开头的无效手机号);
od{9}:后续9位数字,共11位。
-
边界处理
csharp
if (emailMatches.Count ==0) Console.WriteLine("未找到匹配的邮箱地址");
检查匹配结果数量,无匹配时给出明确提示,避免用户困惑。
基础知识拓展 -
字符串不可变性的本质
C#字符串存储在只读内存区域,任何修改操作(如Replace、Substring)都会创建新字符串;
示例:string s = "a"; s += "b"; 实际生成3个字符串:"a"→"ab"→新的"ab"(原"a"被垃圾回收);
性能陷阱:循环拼接字符串时,必须用StringBuilder,否则O(n²)时间复杂度。 - 常用字符串方法对比
| 方法名 | 功能 | 性能 |
|---|---|---|
| string.Replace | 替换指定子串 | 低(不可变) |
| StringBuilder.Replace | 可变替换 | 高(直接修改) |
| string.Split | 分割字符串为数组 | 中(生成新数组) |
| string.Trim | 去除首尾空格 | 低(生成新字符串) |
| Regex.Matches | 正则匹配所有结果 | 中(正则解析开销) |
-
正则表达式必知技巧
匹配模式:RegexOptions.IgnoreCase(忽略大小写)、RegexOptions.Multiline(多行匹配);
预编译正则:Regex regex = new Regex(pattern, RegexOptions.Compiled); 重复使用时性能提升50%;
分组提取:用()分组,如(w+)@(w+).com可提取用户名和域名:match.Groups[1].Value;
转义特殊字符:正则中的特殊字符(如.、*)需用转义,示例:匹配"a.b"需写"a.b"。 -
文本清洗进阶
HTML转义:将<→<、>→>、&→&,避免XSS攻击;
去除特殊字符:Regex.Replace(text, @"[^u4e00-u9fa5a-zA-Z0-9]", "")(保留中文、英文、数字);
换行符统一:text.Replace(" ", " ").Replace(" ", " ")(将Windows换行转为Unix换行)。
扩展思考
1.模板引擎实现:替换文本中的{{变量名}}为对应值(如"Hello {{name}}"→"Hello Tom");
2.Markdown提取:用正则提取Markdown中的标题(# 标题)、链接(text);
3.批量文件处理:读取文件夹中所有.txt文件,批量替换关键词并保存;
4.正则性能优化:对频繁使用的正则,用RegexOptions.Compiled预编译;
5.多语言支持:提取中文姓名、身份证号(正则:[1]d{5}(18|19|20)d{2}(0[1-9]|1[0-2])(0[1-9]|[12]d|3[01])d{3}[dXx]$)。
总结
本实例通过“替换+提取”两大核心场景,覆盖了字符串操作的90%常用技巧:从基础的StringBuilder优化,到复杂的正则提取,再到边界处理。关键是理解字符串不可变性的影响,掌握正则表达式的基础语法,以及性能优化的方法。这些技能将直接应用于Web开发(如表单验证)、数据处理(如日志分析)、自动化脚本(如批量替换)等场景,是C#开发者必备的核心能力。
本站原创,转载请注明出处:https://www.xin3721.com/ArticlecSharp/c49396.html










