VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > c#编程 >
  • 字符串操作——用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();
	}
	}
	}

逐行讲解

  1. 输入处理与空值检查
    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位。
  1. 边界处理
    csharp
    if (emailMatches.Count ==0) Console.WriteLine("未找到匹配的邮箱地址");
    检查匹配结果数量,无匹配时给出明确提示,避免用户困惑。
    基础知识拓展
  2. 字符串不可变性的本质
    C#字符串存储在只读内存区域,任何修改操作(如Replace、Substring)都会创建新字符串;
    示例:string s = "a"; s += "b"; 实际生成3个字符串:"a"→"ab"→新的"ab"(原"a"被垃圾回收);
    性能陷阱:循环拼接字符串时,必须用StringBuilder,否则O(n²)时间复杂度。
  3. 常用字符串方法对比
方法名 功能 性能
string.Replace 替换指定子串 低(不可变)
StringBuilder.Replace 可变替换 高(直接修改)
string.Split 分割字符串为数组 中(生成新数组)
string.Trim 去除首尾空格 低(生成新字符串)
Regex.Matches 正则匹配所有结果 中(正则解析开销)
  1. 正则表达式必知技巧
    匹配模式:RegexOptions.IgnoreCase(忽略大小写)、RegexOptions.Multiline(多行匹配);
    预编译正则:Regex regex = new Regex(pattern, RegexOptions.Compiled); 重复使用时性能提升50%;
    分组提取:用()分组,如(w+)@(w+).com可提取用户名和域名:match.Groups[1].Value;
    转义特殊字符:正则中的特殊字符(如.、*)需用转义,示例:匹配"a.b"需写"a.b"。
  2. 文本清洗进阶
    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.多语言支持:提取中文姓名、身份证号(正则: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


相关教程