-
正则表达式(Regex)基础
正则表达式(Regex)基础
概述
正则表达式(Regular Expression,简称Regex)是一种字符串模式匹配工具,用于快速验证、提取、替换或分割字符串。在C#中,通过System.Text.RegularExpressions命名空间下的Regex类实现vb.net教程C#教程python教程SQL教程access 2010教程正则操作,适用于邮箱验证、手机号匹配、日志分析等场景。
-
正则基础语法
正则的核心是模式字符串,由元字符、量词、字符类等组成。以下是最常用的语法元素:
1.1 元字符(核心匹配规则)
| 元字符 | 作用说明 | 示例 |
| ---- | ---- | ---- |
| . | 匹配任意单个字符(除换行 ) | a.b → 匹配acb、adb(a和b之间有一个任意字符) |
| d | 匹配数字(等价于[0-9]) | d{3} → 匹配123、456(三个数字) |
| w | 匹配字母、数字、下划线(等价于[a-zA-Z0-9_]) | w+ → 匹配hello、user_123(一个或多个单词字符) |
| s | 匹配空白字符(空格、制表符、换行等) | asb → 匹配a b、a b(a和b之间有空白) |
| ^ | 匹配字符串开头 | ^Hello → 匹配以Hello开头的字符串 |
| $ | 匹配字符串结尾 | World$ → 匹配以World结尾的字符串 |
||| 逻辑“或” |
1.2 量词(匹配次数)
| 量词 | 作用说明 | 示例 |
|---|---|---|
| * | 0或多个匹配 | a* → 匹配""、a、aa |
| + | 1或多个匹配 | a+ → 匹配a、aa(不匹配空) |
| ? | 0或1个匹配 | a? → 匹配""、a |
| 恰好n次匹配 | a{3} → 匹配aaa | |
| 至少n次匹配 | a{2,} → 匹配aa、aaa | |
| n到m次匹配 | a{2,3} → 匹配aa、aaa |
1.3 字符类(自定义匹配范围)
用[]包裹的字符集合,匹配其中任意一个字符:
[abc] → 匹配a、b或c
[^abc] → 匹配非a、b、c的字符
[a-z] → 匹配小写字母
[A-Z0-9] → 匹配大写字母或数字
2. C# Regex类常用方法
Regex类提供了一系列静态/实例方法,以下是最常用的5个:
2.1 IsMatch:验证字符串是否匹配
作用:判断输入字符串是否符合正则模式(返回bool)。
场景:验证手机号、邮箱格式。
实例:验证手机号
csharp
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string phone = "13812345678";
// 正则模式:^开头,1[3-9](第二位3-9),d{9}(后9位数字),$结尾
string pattern = @"^1[3-9]d{9}$";
bool isValid = Regex.IsMatch(phone, pattern);
Console.WriteLine($"手机号是否有效:{isValid}"); // 输出:True
}
}
逐行讲解:
pattern:^1确保以1开头;[3-9]匹配第二位(手机号第二位不能是0/1/2);d{9}匹配后9个数字;$确保结尾无多余字符。
Regex.IsMatch:静态方法,直接传入字符串和模式,返回匹配结果。
2.2 Match:获取单个匹配结果
作用:找到输入字符串中第一个匹配的子串(返回Match对象)。
场景:提取字符串中的第一个数字。
实例:提取第一个数字
csharp
string input = "订单号:20240520,金额:199元";
string pattern = @"d+"; // 匹配一个或多个数字
Match match = Regex.Match(input, pattern);
if (match.Success)
{
Console.WriteLine($"第一个数字:{match.Value}"); // 输出:20240520
}
逐行讲解:
match.Success:判断是否找到匹配结果。
match.Value:获取匹配到的子串内容。
2.3 Matches:获取所有匹配结果
作用:找到输入字符串中所有匹配的子串(返回MatchCollection集合)。
场景:提取字符串中的所有数字。
实例:提取所有数字
csharp
string input = "商品A:100元,商品B:200元,商品C:300元";
string pattern = @"d+";
MatchCollection matches = Regex.Matches(input, pattern);
Console.WriteLine("所有数字:");
foreach (Match m in matches)
{
Console.WriteLine(m.Value); // 输出:100、200、300
}
2.4 Replace:替换匹配的子串
作用:将匹配的子串替换为指定内容(返回新字符串)。
场景:替换敏感词、隐藏手机号中间四位。
实例:隐藏手机号中间四位
csharp
string phone = "13812345678";
// 分组捕获:$1取第一位,$2取中间四位,$3取最后四位 → 替换中间四位为****
string pattern = @"(1[3-9])(d{4})(d{4})";
string replaced = Regex.Replace(phone, pattern, "$1****$3");
Console.WriteLine($"隐藏后:{replaced}"); // 输出:138****5678
逐行讲解:
(...):分组捕获,将匹配结果分为3组($1、$2、$3)。
$1$3:替换时保留第一组和第三组,中间替换为。
2.5 Split:按匹配结果分割字符串
作用:将字符串按正则匹配的位置分割(返回字符串数组)。
场景:按任意空白字符分割字符串。
实例:分割空白字符
csharp
string input = "Hello World C#
2024";
string pattern = @"s+"; // 匹配一个或多个空白字符
string[] parts = Regex.Split(input, pattern);
Console.WriteLine("分割结果:");
foreach (string part in parts)
{
Console.WriteLine(part); // 输出:Hello、World、C#、2024
}
-
基础知识拓展
3.1 贪婪 vs 非贪婪匹配
贪婪匹配:默认模式,尽可能匹配最长的子串(用、+等)。
非贪婪匹配:在量词后加?,尽可能匹配最短的子串。
示例:
输入字符串:testdemo
贪婪模式:. → 匹配整个字符串(从第一个到最后一个)。
非贪婪模式:.*? → 匹配test(仅第一个到最近的)。
3.2 分组捕获进阶
分组不仅用于替换,还可提取特定部分:
实例:提取邮箱用户名和域名
csharp
string email = "user@example.com";
string pattern = @"(w+)@(w+.w+)"; // 分组1:用户名,分组2:域名
Match match = Regex.Match(email, pattern);
if (match.Success)
{
string username = match.Groups[1].Value; // user
string domain = match.Groups[2].Value; // example.com
Console.WriteLine($"用户名:{username},域名:{domain}");
}
3.3 正则性能优化
编译正则:对于频繁使用的正则,用RegexOptions.Compiled编译为IL代码,提升重复执行速度。
csharp
Regex regex = new Regex(@"^1[3-9]d{9}$", RegexOptions.Compiled);
bool isValid = regex.IsMatch(phone); // 重复调用时更快
避免过度复杂:复杂正则会降低性能,可拆分多个简单正则或结合字符串操作。
4. 常见正则模板(直接套用)
| 场景 | 正则表达式 |
|---|---|
| 邮箱验证 | [1]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$ |
| 手机号验证 | ^1[3-9]d{9}$ |
| 日期(YYYY-MM-DD) | `^20d{2}-(0[1-9] |
| URL(http/https) |
^https? |
总结
正则表达式是C#字符串处理的“瑞士军刀”,掌握基础语法+Regex类常用方法即可解决80%的场景。重点记住:
用IsMatch验证格式,Matches提取内容,Replace替换字符串。
贪婪匹配转非贪婪加?,分组捕获用()。
频繁使用的正则编译为Compiled模式提升性能。
通过本节学习,你可以快速在项目中应用正则解决实际问题,后续可深入学习正则的高级特性(如正向/反向断言)。
(本节完)
下一章:LINQ进阶:分组与连接查询
(深入讲解GroupBy、Join等复杂LINQ操作)
本站原创,转载请注明出处:https://www.xin3721.com/ArticlecSharp/c49380.html










