C# 正则表达式匹配方法 C#如何使用Regex进行匹配
技术百科
月夜之吻
发布时间:2026-01-21
浏览: 次 Regex.Match() 总返回 Match 对象,须先判 match.Success 再取值;多匹配用 Matches() 或内存敏感时用 NextMatch() 迭代;正则反斜杠需注意 C# 字符串与正则双转义,推荐逐字字符串 @""。
Regex.Match() 最常用但容易忽略返回值检查
调用 Regex.Match() 后,它**总是返回一个 Match 对象**,哪怕没匹配上——此时 Match.Success 为 false,Match.Value 是空字符串。很多人直接取 .Value 导致逻辑出错。
- 务必先判断
match.Success再访问match.Value或match.Groups - 单次匹配用
Match;想获取所有匹配项,改用Regex.Matches()返回MatchCollection - 如果正则含捕获组(如
(\d+)),通过match.Groups[1].Value取第一个括号内容,索引从 1 开始,Groups[0]是整个匹配串
var input = "ID: 12345";
var match = Regex.Match(input, @"ID:\s+(\d+)");
if (match.Success) {
Console.WriteLine(match.Groups[1].Value); // 输出 12345
}RegexOptions 枚举影响匹配行为的关键细节
不传 RegexOptions 时默认区分大小写、不忽略空白、不支持内联注释。几个高频选项组合常被误用:
-
RegexOptions.IgnoreCase:让a匹配A,但注意它**不影响 Unicode 大小写规则**(比如土耳其语的i/
İ) -
RegexOptions.Multiline:仅改变^和$的行为(使其匹配每行首尾),**不影响.是否匹配换行符**——那得用RegexOptions.Singleline -
RegexOptions.Compiled:提升重复使用的正则性能,但首次编译开销大,且会阻止 JIT 内联优化;只推荐在热路径、固定正则、长期存活的场景下使用
Match.NextMatch() 比 Matches() 更省内存的场景
当输入文本极大(如几百 MB 日志)、而匹配结果稀疏(比如每万行才一个目标),用 Regex.Matches() 会一次性构建全部 Match 对象,内存压力陡增。这时应迭代调用 Match.NextMatch():
- 从第一次
Regex.Match()开始,循环调用nextMatch = currentMatch.NextMatch() - 每次只保留当前一个
Match实例,GC 压力小 - 注意
NextMatch()在末尾返回的Match对象,其Success为false,需显式判断退出
var match = Regex.Match(largeText, @"\bERROR\b");
while (match.Success) {
Console.WriteLine($"Found at {match.Index}");
match = match.NextMatch();
}正则字符串里反斜杠的双重转义陷阱
C# 字符串字面量和正则引擎都吃反斜杠。写 \d 时,你得决定是用逐字字符串(@"")还是普通字符串:
- 用逐字字符串:
@"\d+"→ 正则收到的就是\d+(推荐,直观) - 用普通字符串:
"\\d+"→ 第一个\转义第二个\,最终正则也收到\d+ - 混用会翻车:比如
@"C:\temp"在正则里是错的路径写法,因为\t被解释成制表符;此时必须写成@"C:\\temp"或"C:\\\\temp"
最易错的是匹配反斜杠本身:正则要写 \\\\(四个),逐字字符串写成 @"\\\\"(两个),普通字符串写成 "\\\\\\\\"(八个)——别硬记,统一用 @"" + 双反斜杠最稳。
# 的是
# 几个
# 很多人
# 第一个
# 首次
# 第二个
# 迭代
# 使其
# 不支持
# 循环
# 对象
# c#
# 字符串
# 正则表达式
# Regex
# 土耳其
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Python对象比较排序规则_集合使用说明【指导】
- Win11怎么设置多显示器任务栏 Win11扩展任
- 如何使用Golang实现多重错误处理_Golang
- 如何用正则表达式精确匹配“start”到“end”
- Go 中的 := 运算符:类型推导机制与使用边界详
- C++如何使用Qt创建第一个GUI窗口?(入门教程
- c++的位运算怎么用 与、或、异或、移位操作详解【
- 如何在 Go 中调用动态链接库(.so)中的函数
- Win11怎么设置DNS服务器_Windows11
- Django 密码修改后会话失效的解决方案
- c++ atoi和atof函数用法_c++字符数组
- 如何在 Go 中比较自定义的数组类型(如 [20]
- Win11怎么关闭透明效果_Windows11个性
- 如何使用Golang sort排序切片_Golan
- Win11怎么格式化U盘_Win11系统U盘格式化
- 如何开启Windows的远程服务器管理工具(RSA
- SAX解析器是什么,它与DOM在处理大型XML文件
- Win11截图快捷键是什么_Win11自带截图工具
- Win10怎么关闭自动更新错误重启 Win10策略
- php8.4如何配置ssl证书_php8.4htt
- Windows10系统怎么查看CPU温度_Win1
- Win11如何设置电源计划_Win11电源计划优化
- 如何使用Golang实现跨域请求支持_Golang
- 如何在 Go 后端安全获取并验证前端存储的 JWT
- Win11关机快捷键是什么_Win11快速关机方法
- Win11怎样安装网易云音乐_Win11安装网易云
- Win11怎么关闭触摸屏_禁用Win11笔记本触摸
- php内存溢出怎么排查_php内存限制调试与优化方
- Win11怎么开启上帝模式_创建Windows 1
- 如何在Golang中理解指针比较_Golang地址
- Win11怎么关闭透明效果_Windows11辅助
- Python脚本参数接收_sys与argparse
- Win11怎么关闭搜索历史_Win11清除任务栏搜
- 如何在Golang中实现服务熔断与限流_Golan
- VSC怎么在PHP中调试MySQL_数据库交互排查
- Win10如何备份注册表_Win10注册表备份步骤
- Win11如何设置鼠标灵敏度_Win11鼠标灵敏度
- php删除数据怎么清空表_truncate与del
- php报错怎么查看_定位PHP致命错误与警告的方法
- 如何在Golang中使用time处理时间_Gola
- LINUX如何查看文件类型_Linux中file命
- Windows10电脑怎么查看硬盘通电时间_Win
- C++如何获取CPU核心数?(std::threa
- 如何使用Golang配置安全开发环境_防止敏感信息
- Windows怎样关闭桌面弹窗广告_Windows
- Win10如何卸载自带Edge_Win10彻底卸载
- Go 语言标准库为何不提供泛型 Contains
- Win11怎么更改默认打开方式_Win11关联文件
- Win10怎样卸载DockerDesktop_Wi
- php串口通信波特率怎么选_根据硬件手册设置正确波


QQ客服