匹配字符串的强大工具——正则表达式

什么是正则表达式,为什么要使用正则表达式

正则表达式(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
  1. 创建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+");
    
  2. 匹配字符串

    使用 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
    
  3. 查找所有匹配项

    使用 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
    }
    
  4. 常见错误及解析

    如果正则表达式本身有语法错误,创建 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.
    		}
    
  5. 创建对象选项

    在创建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"。
posted @ 2025-03-16 22:26  yinhe6  阅读(14)  评论(0)    收藏  举报