C# 正则表达式匹配
本文跳过正则表达式本身的语法规则(如 \d、+、* 等),完全专注于 C# 语言层面如何调用、处理和优化正则表达式。
在 C# 中,正则相关的所有核心功能都集中在 System.Text.RegularExpressions 命名空间下的 Regex 类中。
一、 C# 中书写正则的字符串技巧
在 C# 中写正则表达式时,最头疼的就是反斜杠 \ 的转义问题。C# 提供了两种非常适合写正则的字符串语法:
- **逐字字符串(Verbatim String)- 使用
@**这是最常见的写法。加上@后,字符串内的\就只是普通字符,不再需要写成\\来转义。
string pattern = @"^\d{4}-\d{2}-\d{2}$"; // 推荐写法
// 等同于普通字符串的:"^\\d{4}-\\d{2}-\\d{2}$"
- 原始字符串字面量(Raw String Literal)- 使用
"""(C# 11 及以上) 如果你的正则表达式里本身就包含大量双引号",用@写法还需要写成""来转义。使用 C# 11 的"""可以完全免除任何转义烦恼。
string pattern = """<a href="([^"]*)">""";
二、 Regex 类的四大核心操作
C# 的 Regex 类提供了四个最常用的操作场景:验证、提取、替换和分割。
1. 验证是否匹配:IsMatch
仅仅用来判断目标字符串是否符合规则,返回 bool,执行效率最高。
bool isValid = Regex.IsMatch("2023-10-25", @"^\d{4}-\d{2}-\d{2}$");
2. 提取数据:Match 与 Matches
用于从文本中把符合规则的部分“揪”出来。
Match(单次匹配):只找第一个符合条件的。Matches(全局匹配):找出所有符合条件的,返回MatchCollection。
// 单次匹配
Match match = Regex.Match("Order: 12345", @"\d+");
if (match.Success)
{
string result = match.Value; // 结果: "12345"
}
// 全局匹配
MatchCollection matches = Regex.Matches("A:10 B:20", @"\d+");
foreach (Match m in matches)
{
Console.WriteLine(m.Value); // 依次输出 10 和 20
}
3. 替换文本:Replace
正则替换比普通的 string.Replace 强大得多,尤其是可以通过 $1、$2 引用捕获组来重组字符串。
string input = "2023-10-25";
string pattern = @"^(\d{4})-(\d{2})-(\d{2})$";
// 将 yyyy-MM-dd 替换为 MM/dd/yyyy
string result = Regex.Replace(input, pattern, "$2/$3/$1");
// 结果: "10/25/2023"
4. 分割字符串:Split
当你需要按复杂的模式(不仅是单一字符)来拆分字符串时使用。
string input = "apple, orange; banana|grape";
// 按逗号、分号或竖线(及其前后的空格)分割
string[] fruits = Regex.Split(input, @"\s*[,;|]\s*");
三、 C# 中的正则提取层级:Match -> Group -> Capture
这是 C# 正则 API 中处理复杂提取时的核心对象模型:
Match:代表一次完整的正则表达式匹配结果。Group(捕获组):对应正则中的小括号()。match.Groups[0]永远是整个匹配结果,match.Groups[1]是第一个括号匹配到的内容,依此类推。你还可以使用命名捕获组(?<name>...),并在 C# 中通过名字提取。Capture(捕获集合):当一个捕获组被量词(如*或+)修饰,导致同一个括号匹配了多次时,CaptureCollection会记录该组每一次捕获的历史。
命名捕获组的使用示例:
string pattern = @"(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})";
Match m = Regex.Match("2023-10-25", pattern);
if (m.Success)
{
// 直接通过名字拿数据,代码可读性极高
string year = m.Groups["year"].Value; // "2023"
string month = m.Groups["month"].Value; // "10"
}
留下评论