LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

解锁 C# 正则表达式的 9 个神技,从此告别繁琐字符串处理!

admin
2025年9月2日 0:23 本文热度 97

前言

你有没有过这样的经历:

“这个日志文件太乱了,怎么提取错误信息?”
“用户输入的金额格式五花八门,怎么统一?”
“这段 HTML 里全是标签,怎么只留文字?”

于是你开始写 SplitSubstringTrimReplace……写了一堆代码,结果还容易出错、难维护。

兄弟,停一下!

你不是在写代码,你是在“手工搓面团”啊!

其实,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 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved