C# 正则表达式使用指南:规则、常用模式与代码示例
本文详细介绍了 C# 中正则表达式的核心构成,包括字符转义、字符类、分组构造与限定符等基础规则。同时提供了一系列实用的常用正则表达式符号及其适用场景,如数字验证、邮箱格式检查及 IP 地址校验。此外,通过多个完整的 C# 控制台应用代码片段,演示了如何使用 System.Text.RegularExpressions.Regex 类进行 IsMatch 判断和 Replace 替换操作。
一、正则表达式基础结构
在 .NET 框架中,正则表达式引擎基于模式匹配输入文本。一个完整的模式由字符、运算符和结构组成。理解其基本构成是编写高效匹配规则的前提。
1. 字符转义
反斜杠 \ 用于指示特殊含义。若字符后跟随无法识别的转义序列,该字符将被原样匹配。
\a:匹配报警字符\u0007。\b(字符组内):匹配退格符\u0008。\t/\r/\v/\f:分别制表符、回车、垂直制表及换页符。\n:匹配换行符\u000A。\dnnn/\xnn/\unnnn:分别使用八进制、十六进制或 Unicode 编码指定字符。\cX:匹配控制字符,如\cC对应 Ctrl-C (\u0003)。
2. 字符类
字符类用于匹配特定集合中的单一字符。
- [
character_group]:匹配括号内的任一字符,区分大小写。 - [
^character_group]:匹配不在该组内的字符(取反)。 - [
first-last]:匹配指定范围内的任意字符,例如[a-z]。 .:通配符,匹配除\n外的任意字符。若要匹配字面意义的句点需转义为\.。\w/\W:匹配单词字符(字母、数字、下划线)或非单词字符。\s/\S:匹配空白字符(空格、制表符等)或非空白字符。\d/\D:匹配十进制数字或非数字。
3. 分组构造
分组允许捕获子串并对子表达式进行操作。
- (
subexpression):标准捕获组,分配序号。 - (?
namesubexpression):命名捕获组。 - (?:
subexpression):非捕获组,不进行内存保存,仅用于逻辑分组。 - (?=
subexpression):正向先行断言(后面必须跟某模式)。 - (?!
subexpression):负向先行断言(后面不能跟某模式)。 - (?<=
subexpression):正向后行断言(前面必须跟某模式)。 - (?>
subexpression):非回溯子表达式(原子组),防止过度回溯提升性能。
4. 限定符
限定符指定前一个元素出现的次数。
*:0 次或多次。+:1 次或多次。?:0 次或 1 次。- {
n}:恰好 n 次。 - {
n,}:至少 n 次。 - {
n,m}:至少 n 次,至多 m 次。 - 在上述每个限定符后加
?(如*?)可启用“最小化”(懒惰)匹配模式,优先匹配少次数。
二、C# 常用正则表达式符号速查
以下是开发中高频使用的预置模式,可直接应用于字符串校验:
| 用途 | 正则模式 |
| 纯数字验证 | ^[0-9]*$ 或 ^\d+$ |
| N位数字 | ^\d{n}$ |
| 正实数(2位小数) | ^[0-9]+(.[0-9]{2})?$ |
| 英文字母组成的字符串 | ^[A-Za-z]+$ |
| 由数字、字母和下划线组成 | ^\w+$ |
| 密码验证(6-18位,以字母开头) | ^[a-zA-Z]\w{5,17}$ |
| 包含特殊字符检测 | [^%&',;=?$\\"]+ |
| 中文字符验证 | ^[\u4e00-\u9fa5]+$ |
| Email 地址验证 | ^(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})$ |
| Internet URL | ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ |
| 电话号码 (带或不带区号) | ^(\(\d{3,4}\)|\d{3,4}-)?\d{7,8}$ |
| 身份证号 (15或18位) | ^\d{15}|\d{18}|\d{17}X$ |
| 月份验证 (01-12) | ^(0?[1-9]|1[0-2])$ |
| 天数验证 (01-31) | ^((0?[1-9])|((1|2)[0-9])|30|31)$ |
| IP 地址 (简单版) | ^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ |
| HTML 标签匹配 | /<[^>]+>/g |
三、代码实现与应用示例
以下示例展示了如何在 C# 程序中调用 System.Text.RegularExpressions 命名空间下的相关方法来实现具体的业务逻辑。
第1步:执行基本匹配 (IsMatch)
目的:验证用户输入的字符串是否包含指定的字符集合。
static void Main(string[] args)
{
// 获取用户输入
string str = Console.ReadLine();
// 定义正则:匹配 a, b 或 c
string regex = @"[abc]";
// 执行匹配并返回布尔值
bool isMatch = Regex.IsMatch(str, regex);
// 输出结果
Console.WriteLine(isMatch ? "Match [abc]" : "not Match [abc]");
Console.WriteLine();
}
第2步:在字符串首尾插入内容 (Replace)
目的:利用锚点 ^ (开头) 和 $ (结尾) 修改字符串结构。
static void Main(string[] args)
{
StringBuilder s = new StringBuilder("www.baidu.com", 50);
string text = s.ToString();
// 替换开头:在字符串起始位置添加文字
string news = Regex.Replace(text, "^", "网址:");
Console.WriteLine(news);
// 替换结尾:在字符串末尾添加文字
news = Regex.Replace(text, "$", "结尾");
Console.WriteLine(news);
Console.ReadLine();
}
第3步:全量字符类型检测
目的:判断整个输入是否全部由非单词字符(即除字母、数字、下划线以外的字符)构成。
static void Main(string[] args)
{
string s = Console.ReadLine();
// ^\W*$:从头到尾全部是非单词字符
string regex = @"^\W*$";
bool isMatch = Regex.IsMatch(s, regex);
Console.WriteLine(isMatch ? "满足" : "不满足");
Console.WriteLine();
}
第4步:排除法字符替换
目的:将除了特定字符(如 b, d, e)以外的所有字符统一替换为 “1”。
static void Main(string[] args)
{
string s = "abcdef";
// [^bde] 表示匹配不包含在 b, d, e 列表中的任意单字符
string regex = @"[^bde]";
string newReplace = Regex.Replace(s, regex, "1");
Console.WriteLine(newReplace); // 输出: b1d1e1
Console.WriteLine();
}
第5步:特定格式号码验证 (QQ号)
目的:严格校验长度为 5 到 11 位的纯数字输入。
static void Main(string[] args)
{
string qq = Console.ReadLine();
string regex = @"^\d{5,11}$";
bool isqq = Regex.IsMatch(qq, regex);
Console.WriteLine(isqq ? "是QQ号" : "不是QQ号");
Console.WriteLine();
}
第6步:IPv4 地址深度验证
目的:精确判断输入的字符串是否符合合法 IPv4 地址格式(0-255 每段)。此例使用循环保持监听直到进程结束。
static void Main(string[] args)
{
// 复杂的分段正则,确保每段数值在 0~255 之间
string regex = @"^((([1]?\d\d?|2[0-4]\d|25[0-5])\.){3}([1]?\d\d?|2[0-4]\d|25[0-5]))$";
while (true)
{
string s = Console.ReadLine();
if(string.IsNullOrEmpty(s)) break; // 空输入退出循环
bool isMatch = Regex.IsMatch(s, regex);
Console.WriteLine(isMatch ? "是有效 IP 地址" : "不是有效 IP 地址");
}
}
以上就是 C# 正则表达式详细内容的介绍,更多关于 C# 基础语法与字符串处理的资料请关注本站其它相关文章!免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









