前言
你有没有过这样的经历:
“这个日志文件太乱了,怎么提取错误信息?”
“用户输入的金额格式五花八门,怎么统一?”
“这段 HTML 里全是标签,怎么只留文字?”
于是你开始写 Split
、Substring
、Trim
、Replace
……写了一堆代码,结果还容易出错、难维护。
兄弟,停一下!
你不是在写代码,你是在“手工搓面团”啊!
其实,C# 早就给你准备了一把瑞士军刀——System.Text.RegularExpressions
(正则表达式)。它不仅能帮你从“字符串泥潭”中解脱,还能让代码更简洁、逻辑更清晰,甚至性能更优!
今天我就把自己在项目中实际使用的9个正则技巧分享给大家,保证让你直呼:"原来还能这样用!"
1. 智能日志解析
下面这段代码可以参考从混乱的日志中提取时间、级别、消息等关键信息。
适合用在日志分析、监控系统、错误追踪等场景
// 从海量日志中快速定位错误信息
string log = "2024-01-15 14:22:33 [ERROR] Database connection failed";
// 使用命名分组(?<name>pattern)提高可读性
var match = Regex.Match(log,
@"(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) \[ERROR\] (?<message>.+)");
if (match.Success)
{
Console.WriteLine($"错误时间: {match.Groups["time"].Value}");
Console.WriteLine($"错误信息: {match.Groups["message"].Value}");
}
// 输出:
// 错误时间: 2024-01-15 14:22:33
// 错误信息: Database connection failed
2. SQL防注入安全检测
检测潜在的SQL注入攻击,比参数化查询更早拦截危险输入,可以说是不折不扣的防注入神器
//
bool IsSqlInjectionSafe(string input)
{
// 匹配常见SQL注入特征:关键字、注释、特殊符号
return !Regex.IsMatch(input,
@"(\b(SELECT|INSERT|DELETE|UPDATE|DROP|EXEC)\b|--|;|/\*|\*/)");
}
// 使用示例
Console.WriteLine(IsSqlInjectionSafe("admin' OR '1'='1")); // false
Console.WriteLine(IsSqlInjectionSafe("张三")); // true
3. 富文本内容提取
从 HTML 中提取纯文本内容,适合用在生成摘要、内容预览、数据清洗等场景
// HTML内容
string html = "<div><h1>标题</h1><p>正文内容<span style='color:red'>带样式</span></p></div>";
// 简单粗暴但有效的去标签方法
string plainText = Regex.Replace(html, "<[^>]*>", "");
Console.WriteLine(plainText); // 输出: 标题正文内容带样式
// 去除多余空白字符
string cleanText = Regex.Replace(plainText, @"\s+", " ").Trim();
4. 智能金额格式化
统一金额显示格式,将数字格式化为带千分位的金额(如 1,234,567.89),支持多种输入格式。
适合财务系统、报表展示、金额输入框等场景
string FormatMoney(string input)
{
// 先去除可能存在的原有分隔符
string cleanInput = Regex.Replace(input, @"[,,]", "");
// 添加千分位分隔符(从右往左每3位加一个逗号)
return Regex.Replace(cleanInput, @"(\d)(?=(\d{3})+(\.|$))", "$1,");
}
// 各种格式使用
Console.WriteLine(FormatMoney("1234567.89")); // 1,234,567.89
Console.WriteLine(FormatMoney("1234567")); // 1,234,567
Console.WriteLine(FormatMoney("1234,567.89")); // 1,234,567.89
5. 版本号智能比较
比较两个版本号(如 1.2.3 vs 1.2.4),判断是否需要更新。
适合用在自动更新检查、依赖版本管理等场景
bool IsNewVersion(string current, string latest)
{
// 使用正则分组直接提取主版本、次版本、修订号
var currentMatch = Regex.Match(current, @"(\d+)\.(\d+)\.(\d+)");
var latestMatch = Regex.Match(latest, @"(\d+)\.(\d+)\.(\d+)");
// 逐级比较版本号
for (int i = 1; i <= 3; i++)
{
int currentPart = int.Parse(currentMatch.Groups[i].Value);
int latestPart = int.Parse(latestMatch.Groups[i].Value);
if (latestPart > currentPart) returntrue;
if (latestPart < currentPart) returnfalse;
}
returnfalse; // 版本号完全相同
}
Console.WriteLine(IsNewVersion("1.2.3", "1.2.4")); // true
Console.WriteLine(IsNewVersion("2.0.0", "1.9.9")); // false
6. 密码强度验证
验证密码是否符合安全策略(大小写、数字、特殊字符、长度)。
bool IsStrongPassword(string password)
{
// 使用正向预查(?=)确保包含各种字符类型
// 至少8位,包含大小写字母、数字、特殊字符
return Regex.IsMatch(password,
@"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{8,}$");
}
// 测试用例
Console.WriteLine(IsStrongPassword("Weak123")); // false - 缺少特殊字符
Console.WriteLine(IsStrongPassword("Strong@123")); // true - 符合要求
Console.WriteLine(IsStrongPassword("短")); // false - 长度不足
7. 中文姓名验证
验证中文姓名格式,支持 ·
连接的少数民族姓名。
适合用在用户注册、实名认证、数据校验等场景
bool IsValidChineseName(string name)
{
// 支持常规中文姓名和少数民族姓名中的间隔号·
// 长度2-10个字符,避免极端情况
return Regex.IsMatch(name, @"^[\u4e00-\u9fa5·]{2,10}$");
}
// 各种姓名格式验证
Console.WriteLine(IsValidChineseName("张三")); // true
Console.WriteLine(IsValidChineseName("欧阳建国")); // true
Console.WriteLine(IsValidChineseName("阿依古丽·买买提")); // true
Console.WriteLine(IsValidChineseName("John")); // false
8. 智能空格清理
清理多余空格,保留合理间距,保持数据整洁。
适合用在表单输入净化、文本预处理、数据清洗等场景
string CleanWhitespace(string input)
{
// 第一步:将多个连续空格替换为单个空格
string step1 = Regex.Replace(input, @"\s+", " ");
// 第二步:清理括号周围的空格
string step2 = Regex.Replace(step1, @"\s?\(\s?", "(");
string step3 = Regex.Replace(step2, @"\s?\)\s?", ")");
return step3.Trim();
}
string messyText = "你好 世界 ! 这是一段 ( 测试文本 ) ";
Console.WriteLine(CleanWhitespace(messyText));
// 输出: "你好 世界 ! 这是一段 (测试文本)"
9. 批量重命名文件
自动化整理照片或文档文件,适合文件管理、自动化脚本、数据整理等场景
void RenameFiles(string pattern, string replacement)
{
foreach (var filePath in Directory.GetFiles("."))
{
string fileName = Path.GetFileName(filePath);
string newName = Regex.Replace(fileName, pattern, replacement);
if (fileName != newName)
{
string newPath = Path.Combine(Path.GetDirectoryName(filePath), newName);
File.Move(filePath, newPath);
Console.WriteLine($"重命名: {fileName} -> {newName}");
}
}
}
// 示例:将"IMG_20240115_123456.jpg"改为"2024-01-15.jpg"
RenameFiles(@"IMG_(\d{4})(\d{2})(\d{2})_\d+\.jpg", "$1-$2-$3.jpg");
总结
看完这9个真实案例,是不是对正则表达式刮目相看了?
其实正则表达式的魅力远不止于此——它就像编程界的"超能力",一旦掌握就能在很多场景下大幅提升开发效率。
正则表达式不是万能的,但在处理文本模式匹配时,它绝对是你的最佳伙伴。
现在就在你的项目里试试这些技巧吧,相信你会爱上这种"一行代码搞定复杂问题"的爽快感!
阅读原文:原文链接
该文章在 2025/9/2 10:57:46 编辑过