1 分钟阅读 次阅读

本文跳过正则表达式本身的语法规则(如 \d+* 等),完全专注于 C# 语言层面如何调用、处理和优化正则表达式。

在 C# 中,正则相关的所有核心功能都集中在 System.Text.RegularExpressions 命名空间下的 Regex 类中。

一、 C# 中书写正则的字符串技巧

在 C# 中写正则表达式时,最头疼的就是反斜杠 \ 的转义问题。C# 提供了两种非常适合写正则的字符串语法:

  1. **逐字字符串(Verbatim String)- 使用 @**这是最常见的写法。加上@后,字符串内的\ 就只是普通字符,不再需要写成 \\ 来转义。
string pattern = @"^\d{4}-\d{2}-\d{2}$"; // 推荐写法
// 等同于普通字符串的:"^\\d{4}-\\d{2}-\\d{2}$"

  1. 原始字符串字面量(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. 提取数据:MatchMatches

用于从文本中把符合规则的部分“揪”出来。

  • 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"
}

标签:

分类:

更新时间:

留下评论