C# 正则表达式匹配方法 C#如何使用Regex进行匹配

10次阅读

Regex.Match() 总返回 Match 对象,须先判 match.Success 再取值;多匹配用 Matches() 或内存敏感时用 NextMatch() 迭代;正则反斜杠需注意 C# 字符串与正则双转义,推荐逐字字符串 @””。

C# 正则表达式匹配方法 C#如何使用Regex进行匹配

Regex.Match() 最常用但容易忽略返回值检查

调用 Regex.Match() 后,它**总是返回一个 Match 对象**,哪怕没匹配上——此时 Match.SuccessfalseMatch.Value 是空字符串。很多人直接取 .Value 导致逻辑出错。

  • 务必先判断 match.Success 再访问 match.Valuematch.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 对象,其 Successfalse,需显式判断退出
var match = Regex.Match(largeText, @"bERRORb"); 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"

最易错的是匹配反斜杠本身:正则要写 \\(四个),逐字字符串写成 @"\\"(两个),普通字符串写成 "\\\\"(八个)——别硬记,统一用 @"" + 双反斜杠最稳。

text=ZqhQzanResources