匹配字符串的强大工具——正则表达式
什么是正则表达式,为什么要使用正则表达式
正则表达式(Regular Expression,简称regex或regexp)是一种用于匹配字符串中字符模式的强大工具,它广泛用于文本处理任务,如验证、搜索、替换和分割等操作。在.NET环境中,正则表达式通过System.Text.RegularExpressions命名空间中的类来实现,主要包括Regex类及其相关方法。简单来说正则表达式就是一种用来描述、匹配或替换文本中特定模式的工具、它就像一种‘文本模具/筛网’,能快速筛选出符合规则的内容
常用场景
- 文本搜索/替换:批量修改文件中的日期格式(如2023-01-01 -> 01/01/2023)
- 表单验证:检查用户输入的邮箱和手机号是否合理
正则表达式几乎所有编程语言和文本编辑器都支持,并且通过简单符号(如*、\d)就能表达复杂规则,一行正则表达式可替代多行代码逻辑。正是因为正则表达式具有通用性、灵活性、效率这些特点,所以用途很广很常用
构成元素
正则表达式通常由普通字符和元字符组成的
普通字符:就是指那些在正则表达式中有直接意义的字符,它们代表自身。
"a",
"12"
"/"
元字符:是具有特殊意义的字符,用于定义搜索模式
| 元字符 | 说明 | 示例 |
|---|---|---|
| . | 匹配除换行符以外的任意字符 | "a.c"可以匹配"a1c"、"a@c"等等 |
| \w | 匹配字母或数字或下划线,等价于[A-Za-z0-9_] | "\w\w\w" 匹配 "wet"、"123"、"q2_" |
| \s | 匹配一个空白字符(包括空格、制表符、换页符等) | "\s\s" 可以匹配两个连续的空白字符 |
| \d | 匹配一个数字字符,等价于[0-9] | ""\d\d\d\d-\d\d"可以匹配年月,如2025-03 |
| \b | 匹配单词的开始或结束 | "\bword\b"可以匹配独立的"word",但不会匹配"wording" |
| ^ | 匹配字符串的开始 | "^\b\b\b$"可以匹配三个全部都为数字的字符串,如123,231 |
| $ | 匹配字符串的结束 | 如上 |
| \W | 匹配任意不是字母,数字,下划线,汉字的字符 | 匹配除字母、数字、下划线、汉字以外的字符形如+,-,*,@,# |
| \S | 匹配一个不是空白符的字符 | 匹配除空格以外的任意字符形如:1,*,) |
| \D | 匹配任意非数字的字符 | ABC,YEC |
| [^x] | 匹配除了x以外的任意字符 | [^ ]这个就是不匹配,x也可以换成asdfc |
| * | 匹配前面的子表达式零次或者多次 | "ab*c"可以匹配"ac","abbc","abbbbbbbc" |
| + | 匹配前面的子表达式一次或多次 | "ab+c"可以匹配"abbc","abc"注意的是不匹配"ac" |
| ? | 匹配前面的子表达式零次或者一次 | "\d?0",匹配"0","10","30" |
{n} |
重复n次 | "\d{8}",重复匹配八次数字,如"12345678" |
{n,m} |
匹配前面的子表达式至少n次,至多m次 | "\d{1,2}"匹配前面的数字至少1次,至多2次,如"1","23" |
| |(竖线) | 表示“或”操作,匹配左边或者右边的表达式 | "a|b" 可以匹配"a"或"b" |
在.net中的使用方法
首先,确保在代码文件顶部添加以下命名空间
using System.Text.RegularExpressions
-
创建Regex对象
有两种方式可以创建一个Regex对象
//使用正则表达式字面量 Regex regex = new Regex(@"\d+"); //使用静态方法(如Regex.IsMatch)时隐式创建(这是静态方法 适合单次操作) bool isMatch = Regex.IsMatch("abc123",@"\d+");在这两种方式中,正则表达式通常都是以字符串的形式传递给Regex构造函数或者静态方法,需要注意的是,正则表达式中的某些字符具有特殊含义,因此需要进行转义。为了简化转义过程,在.net中有两种方式
//普通字符串:需要手动转义反斜杠 \ Regex regex = new Regex("\\d+"); //逐字字符串:使用 @ 前缀,可以避免手动转义反斜杠 Regex regex = new Regex(@"\d+"); -
匹配字符串
使用 IsMatch 方法检查字符串是否符合某个模式
string input = "the price is 1 dollars on 2021-01-01"; var regex1 = new Regex(@"\d\w\s"); var regex2 = new Regex(@"\d{4}-\d{2}-\d{2}"); bool isMatch1 = regex1.IsMatch(input);//false bool isMatch2 = regex2.IsMatch(input);//true -
查找所有匹配项
使用 Matches 方法查找所有匹配项
string input = "$2 apple $13 ananas $2 banana"; var regex1 = new Regex(@"\$\d+"); MatchCollection matches = regex1.Matches(input); foreach(var item in matches) { Console.WriteLine(item);//输出$2 $13 $2 } -
常见错误及解析
如果正则表达式本身有语法错误,创建 Regex 对象时会抛出 ArgumentException
try { Regex regex = new Regex(@"[a-z \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}"); } catch(ArgumentException ex) { Console.WriteLine(ex.Message); //Invalid pattern '[a-z \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}' at offset 40. Unterminated [] set. } -
创建对象选项
在创建regex对象的时候,可以添加忽略大小写的选项
Regex regex = new Regex("abc", RegexOptions.IgnoreCase); bool isMatch = regex.IsMatch("ABC"); //true Console.WriteLine(isMatch);new Regex(pattern, RegexOptions.IgnoreCase | // 忽略大小写 RegexOptions.Multiline | // 多行模式 RegexOptions.Compiled, // 编译为IL代码(提升性能) TimeSpan.FromSeconds(1)); // 设置超时防止DoS攻击
典型应用场景
1、表单验证
// 邮箱验证(简化版)
string emailPattern = @"^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$";
bool isEmail = Regex.IsMatch("user@example.com", emailPattern, RegexOptions.IgnoreCase);
// 身份证号验证(18位)
string idCardPattern = @"^\d{17}[\dXx]$";
bool isValidID = Regex.IsMatch("11010119900307751X", idCardPattern);
2、数据提取
// 提取电话号码
var phoneRegex = new Regex(@"(\d{3})-(\d{4})-(\d{4})");
Match? m = phoneRegex.Match("客服电话:021-5566-7788");
if (m.Success)
{
string fullNumber = m.Value; // 021-5566-7788
string areaCode = m.Groups[1].Value; // 021
}
使用正则表达式整理
只能输入数字:^[0-9]*$。
只能输入n位的数字:^\d{n}$。
只能输入至少n位的数字:^d{n,}$。
只能输入m~n位的数字:^d{m,n}$
只能输入零和非零开头的数字:^(0|[1-9][0-9]*)$
只能输入有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
只能输入有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
只能输入非零的正整数:^+?[1-9][0-9]*$
只能输入非零的负整数:^-[1-9][]0-9*$
只能输入长度为3的字符:^.{3}$
只能输入由26个英文字母组成的字符串:^[A-Za-z]+$
只能输入由26个大写英文字母组成的字符串:^[A-Z]+$
只能输入由26个小写英文字母组成的字符串:^[a-z]+$
只能输入由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
只能输入由数字、26个英文字母或者下划线组成的字符串:^w+$
验证用户密码:^[a-zA-Z]w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。
验证是否含有^%&’,;=?$""等字符:[^%&’,;=?$"x22]+
只能输入汉字:^["u4e00-"u9fa5]{0,}$
验证Email地址:/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/
验证InternetURL:^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$
验证电话号码:^((d{3,4}-)|d{3.4}-)?d{7,8}$正确格式为:"XXX-XXXXXXX"、"XXXX- XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
验证身份证号(15位或18位数字):^d{15}|d{18}$
验证一年的12个月:^(0?[1-9]|1[0-2])$正确格式为:"01"~"09"和"1"~"12"。
验证一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$正确格式为;"01"~"09"和"1"~"31"。

浙公网安备 33010602011771号