C# 正则表达式入门:Regex 基础语法与 5 个常用 API 详解

七月
七月
发布时间:2026-08-23| 176人浏览过
原创

前言

在 C# 里学正则,很多人一开始记住了几个写法,却分不清 API 的职责边界,结果不是校验写得太松,就是替换和提取混在一起。本文按实际开发任务重新整理 `Regex` 的 5 个核心方法,并补上锚点、转义、`d`/`w`/`s` 等基础语法的判断要点,方便你在“校验、提取、替换、切割”之间快速选对工具。

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

先看全局:C# Regex 最常用的 5 个方法

在 System.Text.RegularExpressions.Regex 中,日常最常用的方法主要有这 5 个:

用任务类型区分 C# Regex 五个核心方法的信息图
C# Regex 五个核心方法怎么选把“判断、取一个、取全部、替换、切割”五类任务先分清,再选对应 API,能明显降低 Regex。
  1. IsMatch
  2. Match
  3. Matches
  4. Replace
  5. Split

可以先按任务类型理解它们:

  • 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 很像,但它支持模式匹配,因此适合处理格式转换、批量清洗和基于规则的文本重排。

C# Regex.Replace 三种典型用法的信息图
Regex.Replace 的 3 类替换场同样是替换文本,固定替换、捕获组重排和 MatchEvaluator 适合的任务并不一样。

固定内容替换:把分隔符统一掉

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 用得再熟也很难写对规则。

C# 正则基础语法中锚点、转义和预定义字符类关系图
Regex 基础语法速览正则语法初学者最常卡住的,不是 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 这几组基础规则熟悉起来,后续写更复杂的模式时会顺很多。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。