当前位置: 首页 > news >正文

C# 正则表达式从入门到实战

在日常 .NET 开发中,**正则表达式(Regex)**是处理字符串的利器:数据校验、日志分析、文本替换、爬虫规则、接口参数验证……几乎无处不在。

本文将带你系统掌握 C# 中的正则表达式,包括:

  • ✅ 基础语法结构
  • ✅ 常用匹配规则
  • ✅ 分组与断言(进阶重点)
  • ✅ 替换与实战案例
  • ✅ 性能优化建议
  • ✅ 常见坑位总结

一、什么是正则表达式?

正则表达式(Regular Expression)是一种用于匹配字符串模式的规则表达式

在 C# 中,正则表达式由 .NET 框架中的
👉System.Text.RegularExpressions.Regex类提供支持。

使用命名空间:

usingSystem.Text.RegularExpressions;

二、Regex 常用方法

方法说明
Regex.IsMatch()判断是否匹配
Regex.Matches()获取所有匹配结果
Regex.Match()获取第一个匹配
Regex.Replace()替换匹配内容
Regex.Split()按规则拆分字符串

三、正则表达式基础语法


1️⃣ 字符类

表达式含义
\d数字
\D非数字
\w字母、数字、下划线
\W非单词字符
\s空白字符
.任意字符(除换行)
[abc]匹配 a/b/c
[^abc]不匹配 a/b/c

示例:

stringinput="abc123";boolresult=Regex.IsMatch(input,@"\d+");Console.WriteLine(result);// True

2️⃣ 定位符

表达式含义
^字符串开始
$字符串结束
\b单词边界
\B非单词边界

示例:匹配以 S 开头的单词

stringtext="A Thousand Splendid Suns";MatchCollectionmatches=Regex.Matches(text,@"\bS\S*");foreach(Matchmatchinmatches){Console.WriteLine(match.Value);}

输出:

Splendid Suns

3️⃣ 量词(限定符)

表达式含义
*0次或多次
+1次或多次
?0或1次
{n}n次
{n,}至少n次
{n,m}n到m次

示例:匹配手机号

stringpattern=@"^1\d{10}$";

四、分组与捕获(核心重点)


1️⃣ 普通分组

(\w+)

示例:

stringtext="one two";stringpattern=@"(\w+)\s(\w+)";stringresult=Regex.Replace(text,pattern,"$2 $1");Console.WriteLine(result);// two one

2️⃣ 命名分组(推荐使用)

(?<name>pattern)

示例:

stringtext="2025-03-04";stringpattern=@"(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})";Matchmatch=Regex.Match(text,pattern);Console.WriteLine(match.Groups["year"].Value);Console.WriteLine(match.Groups["month"].Value);Console.WriteLine(match.Groups["day"].Value);

五、零宽断言(高级必会)

断言不会消耗字符,只判断位置。


✅ 正向先行断言

\w+(?=\.)

匹配 . 之前的内容


✅ 负向先行断言

\b(?!un)\w+\b

匹配不以 un 开头的单词


✅ 正向后行断言

(?<=19)\d{2}

示例:

stringinput="1851 1999 1950 1905 2003";stringpattern=@"(?<=19)\d{2}\b";foreach(MatchmatchinRegex.Matches(input,pattern)){Console.WriteLine(match.Value);}

输出:

99 50 05

六、实战案例


🔥 案例1:去除多余空格

stringinput="Hello World ";stringresult=Regex.Replace(input,@"\s+"," ");Console.WriteLine(result);

🔥 案例2:验证邮箱

stringpattern=@"^[\w\.-]+@[\w\.-]+\.\w+$";

🔥 案例3:提取HTML标签内容

stringpattern=@"<title>(.*?)</title>";

⚠️ 注意:复杂 HTML 不建议用正则,建议使用 HTML 解析器。


🔥 案例4:验证身份证号(简单版)

stringpattern=@"^\d{17}[\dX]$";

七、性能优化建议(高级开发者必看)


1️⃣ 预编译正则

Regexregex=newRegex(pattern,RegexOptions.Compiled);

适用于高频调用场景。


2️⃣ 使用静态缓存

privatestaticreadonlyRegexphoneRegex=newRegex(@"^1\d{10}$",RegexOptions.Compiled);

避免重复创建对象。


3️⃣ 避免灾难性回溯

问题示例:

(a+)+

解决方法:

  • 使用非贪婪模式
  • 使用原子组(?>...)
  • 限制量词范围

八、常见坑位总结

错误说明
忘记使用 @ 字符串转义错乱
.* 贪婪匹配过多应使用 .*?
正则写得过长建议拆分逻辑
复杂 HTML 用正则容易翻车

九、什么时候不该用正则?

  • 复杂 HTML/XML 解析
  • JSON 解析
  • 复杂业务规则判断

正则适合做:

✔ 字符串校验
✔ 模式匹配
✔ 批量替换
✔ 日志分析


十、总结

C# 正则表达式核心掌握五点:

  1. 字符类
  2. 量词
  3. 分组
  4. 断言
  5. 替换

建议学习路径:

基础语法 → 分组 → 断言 → 实战 → 性能优化


结语

正则表达式不是洪水猛兽,而是一把利器。

写得好,是优雅。
写得烂,是灾难。

建议:

✔ 多写小例子练习
✔ 善用在线调试工具
✔ 养成写注释习惯


👋 关注我!持续分享 C# 实战技巧、代码示例 & 技术干货

http://www.jsqmd.com/news/436295/

相关文章:

  • 基于深度学习的3D打印缺陷识别检测系统|全新web界面|多模态|AI大模型智能分析|YOLOv8、YOLOv10、YOLOv11、YOLOv12
  • 人形机器人24小时风向变了:面部智能进化+工厂实习加速落地
  • Java 通过GDAL实现将图片转成GEOTIFF文件
  • 聚焦环保全屋定制:2026国内最新适配家装柜体防潮需求的十大木纹板材实力厂家 - 十大品牌榜
  • 基于深度学习的苹果成熟度识别检测系统|全新web界面|多模态|AI大模型智能分析|YOLOv8、YOLOv10、YOLOv11、YOLOv12
  • 车载以太网设备如何进行线束连接
  • 靠谱的海关数据生产厂家
  • 聚焦环保健康全屋定制:2026国内最新适配家装柜体需求的十大生态板加工厂 - 十大品牌榜
  • 基于深度学习的条形码识别检测系统|全新web界面|多模态|AI大模型智能分析|YOLOv8、YOLOv10、YOLOv11、YOLOv12
  • Matlab直流潮流程序实现详解(基于IEEE 9节点系统)
  • winform 继承Panel的控件设置双缓冲
  • 基于深度学习的轴承缺陷识别检测系统|全新web界面|多模态|AI大模型智能分析|YOLOv8、YOLOv10、YOLOv11、YOLOv12
  • 内燃机专业EI会议IOP-JPCS出版 | 2026年内燃机技术与能源动力工程国际学术会议(ICTEPE 2026)
  • Java基础(下)之网络编程
  • 聚焦环保健康全屋定制:2026国内最新适配家装全场景的十大柜子定制板材生产厂家 - 十大品牌榜
  • Java基础(课后笔记)
  • 改造策略
  • Superpowers:CC 资深工程素养 Skills 库
  • CANoe性能问题的处理方法
  • GIT将某分支(develop分支)合并至某分支(yunwei/develop分支)具体过程
  • 2026年发电机租赁行业权威分析报告:深度解析与优选指南 - 深度智识库
  • C++数据结构与算法_双指针法
  • 2026年中国智能办公平台深度研究报告
  • 【奖励到账】CSDN AI 社区镜像创作激励活动第八批奖励正式发放!
  • 聚焦环保全屋定制:2026国内最新适配家装柜体需求的十大欧松板源头厂家 - 十大品牌榜
  • 2026年发电车租赁厂家三大推荐榜:发电车租赁行业现状与筛选标准 - 深度智识库
  • Xbotics社区 | ArXiv 机器人学每日速递(2026.03.04)
  • 氙灯老化试验箱2026行业全景探究:六大主流品牌厂家实力剖析与科学选型指南 - 品牌推荐大师1
  • 国内有哪些好的字画回收机构?科普指南教你精准挑选 - 品牌排行榜单
  • BXMya GDD471A001 2UBA002322R0001 数字量输入/输出模块