跳转到内容

C Sharp 正则表达式

来自代码酷
Admin留言 | 贡献2025年4月29日 (二) 18:42的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

C#正则表达式[编辑 | 编辑源代码]

正则表达式(Regular Expression,简称Regex)是一种强大的文本处理工具,用于在字符串中搜索、匹配和替换符合特定模式的文本。在C#中,正则表达式通过System.Text.RegularExpressions命名空间提供支持,是处理复杂字符串操作的利器。

基本概念[编辑 | 编辑源代码]

正则表达式由一系列字符和特殊符号组成,用于定义搜索模式。以下是核心概念:

  • 字面字符:普通字符(如'a','1')直接匹配自身
  • 元字符:具有特殊含义的字符(如., *, +, ?
  • 字符类:用方括号定义(如[a-z]匹配任意小写字母)
  • 量词:指定匹配次数(如{3}表示精确匹配3次)

正则表达式引擎[编辑 | 编辑源代码]

C#使用回溯型正则表达式引擎,其工作流程如下:

graph TD A[输入字符串] --> B(模式匹配) B --> C{匹配成功?} C -->|是| D[返回匹配结果] C -->|否| E[尝试其他可能性] E --> B

基础语法[编辑 | 编辑源代码]

以下是常见元字符及其含义:

元字符 描述 示例
. 匹配任意单个字符(除换行符) a.c匹配"abc","a1c"
\d 匹配数字(等价于[0-9] \d\d匹配"42"
\w 匹配单词字符(字母、数字、下划线) \w+匹配"hello_123"
\s 匹配空白字符(空格、制表符等) \s\w匹配" a"
^ 匹配字符串开始位置 ^\d匹配"3apples"中的"3"
$ 匹配字符串结束位置 \.$匹配"end."中的"."

C#中的实现[编辑 | 编辑源代码]

C#提供Regex类处理正则表达式,主要方法包括:

基本匹配[编辑 | 编辑源代码]

using System;
using System.Text.RegularExpressions;

class Program {
    static void Main() {
        string pattern = @"\d+";  // 匹配一个或多个数字
        string input = "Order 12345 placed";
        
        Match match = Regex.Match(input, pattern);
        if (match.Success) {
            Console.WriteLine($"Matched: {match.Value}");  // 输出: Matched: 12345
        }
    }
}

常见操作[编辑 | 编辑源代码]

方法 描述 示例
IsMatch 检查是否匹配 Regex.IsMatch("123", @"\d+") → true
Match 返回第一个匹配 Regex.Match("a1 b2", @"\d").Value → "1"
Matches 返回所有匹配 Regex.Matches("a1 b2", @"\d").Count → 2
Replace 替换匹配文本 Regex.Replace("a1", @"\d", "2") → "a2"
Split 按模式分割字符串 Regex.Split("a1b2", @"\d") → ["a","b",""]

分组与捕获[编辑 | 编辑源代码]

圆括号()创建捕获组,可提取子匹配:

string pattern = @"(\w+)@(\w+\.\w+)";
string email = "user@example.com";

Match m = Regex.Match(email, pattern);
if (m.Success) {
    Console.WriteLine($"Username: {m.Groups[1].Value}");  // user
    Console.WriteLine($"Domain: {m.Groups[2].Value}");   // example.com
}

实际应用案例[编辑 | 编辑源代码]

案例1:验证电子邮件格式[编辑 | 编辑源代码]

bool IsValidEmail(string email) {
    string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";
    return Regex.IsMatch(email, pattern);
}

Console.WriteLine(IsValidEmail("test@example.com"));  // true
Console.WriteLine(IsValidEmail("invalid.email"));    // false

案例2:提取日志信息[编辑 | 编辑源代码]

string logEntry = "[2023-04-01 14:30:22] ERROR: File not found";
string pattern = @"^\[(.+?)\]\s+(\w+):\s+(.+)$";

Match m = Regex.Match(logEntry, pattern);
if (m.Success) {
    Console.WriteLine($"Timestamp: {m.Groups[1].Value}");
    Console.WriteLine($"Log Level: {m.Groups[2].Value}");
    Console.WriteLine($"Message: {m.Groups[3].Value}");
}

输出:

Timestamp: 2023-04-01 14:30:22
Log Level: ERROR
Message: File not found

性能优化[编辑 | 编辑源代码]

  • 预编译正则表达式:使用RegexOptions.Compiled
  • 重用Regex对象:避免重复创建
  • 避免过度回溯:使用原子组(?>...)或占有量词?+, *+, ++
// 预编译示例
Regex precompiledRegex = new Regex(@"\d{4}-\d{2}-\d{2}", 
    RegexOptions.Compiled | RegexOptions.IgnoreCase);

高级主题[编辑 | 编辑源代码]

零宽断言[编辑 | 编辑源代码]

断言 描述 示例
(?=...) 正向先行断言 \w+(?=!)匹配"hello!"中的"hello"
(?!...) 负向先行断言 \d{3}(?!\d)匹配"123a"中的"123"
(?<=...) 正向后行断言 (?<=\$)\d+匹配"$100"中的"100"
(?<!...) 负向后行断言 (?<!-)\d+匹配"1-2"中的"1"

平衡组[编辑 | 编辑源代码]

用于匹配嵌套结构(如括号):

string nested = "(a(b)c)";
string pattern = @"(?<open>\(|\[)+(?<content>[^\(\)\[\]]+)(?<close-open>\)|\])+";

MatchCollection mc = Regex.Matches(nested, pattern);
foreach (Match m in mc) {
    Console.WriteLine(m.Groups["content"].Value);  // 输出: b
}

常见问题[编辑 | 编辑源代码]

Q: 何时应该使用正则表达式?

  • 适合:模式匹配、文本提取、复杂替换
  • 不适合:XML/HTML解析、语法分析、简单字符串操作

Q: 如何调试复杂的正则表达式?

  • 使用在线测试工具(如regex101.com)
  • 分解复杂模式为多个简单部分
  • 启用RegexOptions.IgnorePatternWhitespace添加注释

数学表示[编辑 | 编辑源代码]

正则表达式可以形式化为: R::=|ϵ|a|RR|RR|R* 其中:

  • :空语言
  • ϵ:空字符串
  • a:字母表中的字符
  • :连接运算
  • :并运算
  • *:Kleene星号

总结[编辑 | 编辑源代码]

正则表达式是C#中处理字符串的强大工具,通过本指南您已经学习了:

  • 基础语法和元字符
  • C#中Regex类的使用方法
  • 实际应用案例
  • 性能优化技巧
  • 高级特性如零宽断言

掌握正则表达式将显著提升您的文本处理能力,但需注意合理使用,避免过度复杂的模式影响可读性和性能。