C# 中的正则表达式:Regex 类基础操作
正则表达式 (regex) 是一种强大的工具,用于根据指定模式搜索、提取、替换和验证字符串。在 C# (.NET) 中,所有正则表达式操作都集中在 System.Text.RegularExpressions 命名空间和核心类 Regex 中。本文将通过实际示例,讲解 C# 中正则表达式的基础和高级功能。
1. Regex 类:主要方法和模式创建
要在 C# 中使用正则表达式,您需要引入命名空间:
using System.Text.RegularExpressions;
Regex 类提供了几个关键方法:
- IsMatch — 检查字符串是否包含与模式匹配的内容。
- Match — 返回第一个匹配项。
- Matches — 返回所有匹配项。
- Replace — 将找到的匹配项替换为指定字符串。
- Split — 根据匹配项拆分字符串。
一个简单的电子邮件地址验证示例:
string email = "user@example.com";
string pattern = @"^[\\w\\.-]+@[\\w\\.-]+\\.\\w+$";
bool isValid = Regex.IsMatch(email, pattern);
Console.WriteLine(isValid); // True
请注意字符串前的 @ 符号 — 这是逐字字符串 (verbatim string),可以简化模式中反斜杠 (\\) 的编写。
2. 数据搜索与提取:Match 和 Matches 方法
Match 方法返回一个 Match 对象,其中包含第一个匹配项的信息。如果没有匹配项,Success 属性将为 false。
从文本中提取电话号码的示例:
string text = "请拨打号码 +7 (123) 456-78-90 或 +7 (987) 654-32-10";
string pattern = @"\\+7\\s?\\(\\d{3}\\)\\s?\\d{3}-\\d{2}-\\d{2}";
MatchCollection matches = Regex.Matches(text, pattern);
foreach (Match match in matches)
{
Console.WriteLine(match.Value);
}
// 输出:
// +7 (123) 456-78-90
// +7 (987) 654-32-10
Matches 方法返回所有匹配项的集合。您还可以使用捕获组来提取特定部分:
string text = "ID: 12345, 价格: 999.99";
string pattern = @"价格:\\s*(\\d+\\.?\\d*)";
Match match = Regex.Match(text, pattern);
if (match.Success)
{
string price = match.Groups[1].Value;
Console.WriteLine($"价格: {price}"); // 价格: 999.99
}
捕获组在模式中用圆括号 () 表示。第 0 组是整个匹配项,第 1 到第 N 组是捕获的子字符串。
3. 字符串替换与拆分:Replace 和 Split
Replace 方法允许灵活地替换匹配项。支持反向引用 ($1、$2 等) 来插入捕获的组。
将日期格式从 "YYYY-MM-DD" 转换为 "DD.MM.YYYY" 的示例:
string date = "2025-03-15";
string pattern = @"(\\d{4})-(\\d{2})-(\\d{2})";
string replacement = "$3.$2.$1";
string result = Regex.Replace(date, pattern, replacement);
Console.WriteLine(result); // 15.03.2025
Split 方法根据模式匹配项拆分字符串。这对于解析 CSV 或日志文件非常方便:
string data = "apple;banana;cherry;grape";
string pattern = @";";
string[] fruits = Regex.Split(data, pattern);
foreach (var fruit in fruits)
{
Console.WriteLine(fruit);
}
// 输出:
// apple
// banana
// cherry
// grape
您还可以使用更复杂的分隔符,例如多个空格或标点符号:
string text = "一 二,三;四";
string[] parts = Regex.Split(