C Sharp 正则表达式
外观
C#正则表达式[编辑 | 编辑源代码]
正则表达式(Regular Expression,简称Regex)是一种强大的文本处理工具,用于在字符串中搜索、匹配和替换符合特定模式的文本。在C#中,正则表达式通过System.Text.RegularExpressions命名空间提供支持,是处理复杂字符串操作的利器。
基本概念[编辑 | 编辑源代码]
正则表达式由一系列字符和特殊符号组成,用于定义搜索模式。以下是核心概念:
- 字面字符:普通字符(如'a','1')直接匹配自身
- 元字符:具有特殊含义的字符(如
.
,*
,+
,?
) - 字符类:用方括号定义(如
[a-z]
匹配任意小写字母) - 量词:指定匹配次数(如
{3}
表示精确匹配3次)
正则表达式引擎[编辑 | 编辑源代码]
C#使用回溯型正则表达式引擎,其工作流程如下:
基础语法[编辑 | 编辑源代码]
以下是常见元字符及其含义:
元字符 | 描述 | 示例 |
---|---|---|
. |
匹配任意单个字符(除换行符) | 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
添加注释
数学表示[编辑 | 编辑源代码]
正则表达式可以形式化为: 其中:
- :空语言
- :空字符串
- :字母表中的字符
- :连接运算
- :并运算
- :Kleene星号
总结[编辑 | 编辑源代码]
正则表达式是C#中处理字符串的强大工具,通过本指南您已经学习了:
- 基础语法和元字符
- C#中Regex类的使用方法
- 实际应用案例
- 性能优化技巧
- 高级特性如零宽断言
掌握正则表达式将显著提升您的文本处理能力,但需注意合理使用,避免过度复杂的模式影响可读性和性能。