在 C# 里写正则,难点通常不在于 API 数量,而在于什么时候该用“判断是否匹配”,什么时候该取第一个结果、取全部结果,或者直接做替换与切割。本文按常见开发任务重组内容,把 Regex 的 5 个核心方法和几组最常用语法拆开讲清,并保留示例代码,方便你直接对照使用场景判断该选哪一种写法。
先看全局:C# Regex 最常用的 5 个方法
在 System.Text.RegularExpressions.Regex 中,日常最常用的方法主要有这 5 个:

IsMatchMatchMatchesReplaceSplit
可以先按任务类型理解它们:
IsMatch:只关心“符不符合规则”Match:只拿第一个匹配结果Matches:把所有匹配结果都取出来Replace:按模式替换文本Split:按模式切割字符串
如何判断输入是否符合规则:Regex.IsMatch
IsMatch 是表单校验、输入合法性检查里最常见的方法。它返回一个布尔值,用来回答“这段字符串是否匹配指定模式”。
入门示例:校验日期格式
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = "2025-12-18";
string pattern = @"^d{4}-d{2}-d{2}$";
bool isValid = Regex.IsMatch(input, pattern);
Console.WriteLine(isValid); // True
}
}
这个示例里有几个关键点:
pattern是正则表达式,@"..."是 C# 的逐字字符串字面量。^和$是锚点,表示“从头到尾整串匹配”。d{4}表示 4 位数字。-是字面量字符-。Regex.IsMatch用来判断字符串里是否存在满足这个模式的内容。
默认是“包含匹配”,不是“整串匹配”
IsMatch 最容易让初学者误解的一点,是它默认只要找到一个满足条件的子串,就会返回 true,并不要求整个字符串完全符合规则。
bool isEmail = Regex.IsMatch(email, pattern);
例如:
string input = "Order12345";
string pattern = @"d{3}";
bool has3Digits = Regex.IsMatch(input, pattern); // True
这里返回 True,原因不是 Order12345 整体匹配了 d{3},而是其中包含能匹配到的数字片段。
如果你的目标是“整个字符串都必须符合规则”,要把模式放在 ^ 和 $ 之间:
// 只允许由 3~5 位数字组成,不允许多一个字符
string pattern = @"^d{3,5}$";
要拿到匹配结果时,用 Match 还是 Matches
当你不只想知道“有没有”,而是还要拿到具体内容、位置、长度时,就该从 IsMatch 切换到 Match 或 Matches。
Regex.Match:获取第一个匹配
string text = "My phone is 123-456-7890.";
string pattern = @"d{3}-d{3}-d{4}";
Match match = Regex.Match(text, pattern);
if (match.Success)
{
Console.WriteLine(match.Value); // "123-456-7890"
Console.WriteLine(match.Index); // 起始索引
Console.WriteLine(match.Length); // 匹配的长度
}
Match 适合“文本里可能有多个结果,但我只关心第一个”的场景。常用成员包括:
match.Success:是否匹配成功match.Value:匹配到的字符串match.Index:匹配在原文本中的起始位置(从 0 开始)match.Length:匹配结果长度
Regex.Match 也有带起始位置、带 RegexOptions 的重载,适合更细粒度的控制。
Regex.Matches:一次取出所有匹配
string text = "ID: 100, 200, 300";
string pattern = @"d+";
MatchCollection matches = Regex.Matches(text, pattern);
foreach (Match m in matches)
{
Console.WriteLine($"{m.Value} at {m.Index}");
}
// 输出:
// 100 at 4
// 200 at 9
// 300 at 14
如果要把文本中的所有命中项遍历出来,Matches 会更合适。它返回 MatchCollection,可以直接配合 foreach 使用。
集合里的每个 Match,同样可以访问 Value、Index、Groups 等属性。
需要改写文本时:Regex.Replace 的 3 种典型用法
Regex.Replace 和字符串自带的 Replace 很像,但它支持模式匹配,因此适合处理格式转换、批量清洗和基于规则的文本重排。

固定内容替换:把分隔符统一掉
string input = "2025/12/18";
string pattern = @"/";
string result = Regex.Replace(input, pattern, "-");
Console.WriteLine(result); // "2025-12-18"
这个例子和 input.Replace("/", "-") 的效果相近,但一旦模式比单个字符复杂,正则替换就会更灵活。
捕获组重排:直接重组日期顺序
string input = "2025-12-18";
string pattern = @"(d{4})-(d{2})-(d{2})";
// 把 yyyy-MM-dd 改成 dd/MM/yyyy
string result = Regex.Replace(input, pattern, "$3/$2/$1");
// result: "18/12/2025"
这里的 $1、$2、$3 对应各个捕获组。先匹配,再按新顺序拼回去,是 Replace 最实用的一类写法。
MatchEvaluator:替换时顺带做计算
string input = "Price: 100 USD, 200 USD";
string pattern = @"(d+)s*USD";
string result = Regex.Replace(input, pattern, m =>
{
int value = int.Parse(m.Groups[1].Value);
int converted = (int)(value * 7.2); // 假设汇率
return $"{converted} CNY";
});
Console.WriteLine(result);
// "Price: 720 CNY, 1440 CNY"
当替换逻辑不只是“换成另一段固定文本”,而是要结合捕获结果做运算、格式化或条件判断时,就可以使用这个版本。
多分隔符切割字符串:Regex.Split
Regex.Split 的价值,在于它可以按“模式”而不是按单一字符切割,这对日志、输入串、标签文本等场景很实用。
string input = "apple, banana; cherry|date";
string pattern = @"[,;|]s*"; // 逗号;分号;竖线 + 可选空白
string[] parts = Regex.Split(input, pattern);
foreach (var p in parts)
{
Console.WriteLine(p);
}
// apple
// banana
// cherry
// date
这类写法比手动连写多个 Split 更集中,也更容易扩展规则。
Regex 基础语法:先掌握字面字符、转义和常用字符类
API 解决的是“怎么操作”,语法决定的是“怎么写模式”。如果基础语法没有理顺,API 用得再熟也很难写对规则。

字面字符与转义
绝大多数普通字符在正则里就是字面意思,例如:
- 模式:
abc→ 匹配文本中出现的abc - 模式:
hello→ 匹配文本中出现的hello
但以下字符在正则中有特殊含义:
.^$*+?()[]{}|
如果你想匹配它们的字面含义,就需要转义。
例如:
- 匹配一个点号
.→ 模式. - 匹配一个星号
*→ 模式* - 匹配一对括号
(abc)→ 模式(+abc+)
在 C# 中配合逐字字符串时,通常这样写:
string pattern = @"."; // 匹配 "."
string pattern2 = @"*"; // 匹配 "*"
如果不用 @:
string pattern = "\\."; // C# 字符串里写成 "\\." 才表示一个反斜杠+点
实际开发里,正则字符串几乎都会优先使用 @"",因为能明显减少反斜杠层层转义带来的阅读负担。
预定义字符类:d / w / s
预定义字符类是最常见、也最值得先记住的一组写法,它们分别代表某一类字符。
d / D:数字与非数字
d:digit,匹配 0–9 的任意一位数字,相当于[0-9]D:非数字,相当于[^0-9]
示例:
string pattern = @"d+";
w / W:单词字符与非单词字符
w:word,匹配字母、数字和下划线,相当于[A-Za-z0-9_]W:非w
示例:
string pattern = @"w+";
s / S:空白字符与非空白字符
s:space,匹配空格、制表符、换行等所有空白字符S:非空白
示例:
string pattern = @"s+"; // 匹配一个或多个空白
怎么把这些 API 和语法真正用起来
如果只是做输入校验,先从 Regex.IsMatch 和锚点 ^、$ 开始就够了;如果要取结果内容,再转向 Match 或 Matches;如果目的是改写文本结构,优先考虑 Replace 和捕获组;遇到多分隔符拆分,则直接使用 Split。
而在语法层面,至少先把字面字符、转义、d/w/s 这几组基础规则熟悉起来,后续写更复杂的模式时会顺很多。









