VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > c#编程 >
  • 正则表达式(Regex)基础

正则表达式(Regex)基础
概述
正则表达式(Regular Expression,简称Regex)是一种字符串模式匹配工具,用于快速验证、提取、替换或分割字符串。在C#中,通过System.Text.RegularExpressions命名空间下的Regex类实现vb.net教程C#教程python教程SQL教程access 2010教程正则操作,适用于邮箱验证、手机号匹配、日志分析等场景。

  1. 正则基础语法
    正则的核心是模式字符串,由元字符、量词、字符类等组成。以下是最常用的语法元素:
    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
	}
  1. 基础知识拓展
    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. 常见正则模板(直接套用)

场景 正则表达式
邮箱验证 +@[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?/[a-zA-Z0-9.-]+.[a-zA-Z]{2,}(/S*)?$

总结
正则表达式是C#字符串处理的“瑞士军刀”,掌握基础语法+Regex类常用方法即可解决80%的场景。重点记住:
用IsMatch验证格式,Matches提取内容,Replace替换字符串。
贪婪匹配转非贪婪加?,分组捕获用()。

频繁使用的正则编译为Compiled模式提升性能。
通过本节学习,你可以快速在项目中应用正则解决实际问题,后续可深入学习正则的高级特性(如正向/反向断言)。
(本节完)
下一章:LINQ进阶:分组与连接查询
(深入讲解GroupBy、Join等复杂LINQ操作)


本站原创,转载请注明出处:https://www.xin3721.com/ArticlecSharp/c49380.html


相关教程