# C#正则表达式Regex学习:从字符串匹配到数据提取
一、什么是正则表达式在C#开发过程中经常需要对字符串进行处理例如判断手机号格式是否正确验证邮箱格式从字符串中提取指定数据替换字符串中的某些内容如果使用传统字符串方法例如Contains()判断是否包含某个字符串IndexOf()查找字符串位置Substring()截取字符串只能处理一些简单情况。当字符串规则比较复杂时例如手机号13812345678要求第一位必须是1第二位必须是3-9后面必须9位数字如果使用普通代码判断会比较繁琐。这时候就可以使用正则表达式。正则表达式Regular Expression简称Regex是一种通过规则描述字符串格式的方法。简单来说正则表达式就是使用一套规则快速判断和处理字符串。二、C#中的Regex类C#中提供了专门处理正则表达式的类System.Text.RegularExpressions其中最常用的方法方法作用Regex.IsMatch()判断字符串是否匹配Regex.Match()获取一个匹配结果Regex.Matches()获取多个匹配结果Regex.Replace()替换字符串内容三、Regex.IsMatch判断字符串是否满足规则Regex.IsMatch()主要作用判断一个字符串是否符合指定的正则规则。返回值true表示匹配成功。false表示匹配失败。例如判断字符串中是否包含数字stringtext123;boolresultRegex.IsMatch(text,\d);Console.WriteLine(result);运行结果True这里\d表示匹配任意一个数字。例如stringtextABC;boolresultRegex.IsMatch(text,\d);Console.WriteLine(result);运行结果False因为ABC里面没有数字。四、正则表达式中的数量匹配符在实际开发中经常需要判断某个字符出现多少次。正则表达式提供了几个常用符号符号含义*0次或者多次1次或者多次?0次或者1次{n}固定n次{n,m}出现n到m次1、*表示0次或者多次例如stringtextaaa;boolresultRegex.IsMatch(text,a*);Console.WriteLine(result);输出True其中a*表示字符a可以出现0次 1次 2次 多次所以aaa满足条件。2、表示至少出现一次代码stringtextaaa;boolresultRegex.IsMatch(text,a);Console.WriteLine(result);输出True其中a表示字符a必须出现至少一次。如果stringtexthello;boolresultRegex.IsMatch(text,a);Console.WriteLine(result);输出False原因要求至少存在一个a。3、?表示0次或者1次代码stringtextapple;boolresultRegex.IsMatch(text,a?);Console.WriteLine(result);输出True其中a?表示a可以出现0次 或者1次4、{}指定匹配次数例如匹配4个数字stringtext2026;boolresultRegex.IsMatch(text,\d{4});Console.WriteLine(result);输出True其中\d{4}表示连续匹配4个数字。例如2026符合要求。如果stringtext26;boolresultRegex.IsMatch(text,\d{4});Console.WriteLine(result);输出False因为数字不足4位。5、{n,m}范围匹配例如stringtext123;boolresultRegex.IsMatch(text,\d{2,4});Console.WriteLine(result);输出True表示数字长度必须2位到4位所以12 123 1234都满足。五、手机号验证案例实际开发中经常需要验证用户输入的数据格式。例如手机号码验证。规则第一位1 第二位3-9 后面9位数字 总共11位代码stringphone13812345678;stringpattern^1[3-9]\d{9}$;boolresultRegex.IsMatch(phone,pattern);Console.WriteLine(result);输出True正则表达式^1[3-9]\d{9}$拆开分析^表示开始。1表示第一位必须是1。[3-9]表示第二位必须是3到9。\d{9}表示后面9位数字。$表示结束。最终组成13812345678满足手机号规则。六、邮箱验证案例邮箱格式例如3313545707qq.com代码stringemail331354qq.com;stringpattern^[\w][a-zA-Z0-9]\.[a-zA-Z]$;boolresultRegex.IsMatch(email,pattern);Console.WriteLine(result);输出True其中表示邮箱分隔符。\w表示多个字母、数字或者下划线。\.表示匹配小数点。通过正则可以快速判断邮箱格式是否正确。七、Match提取字符串中的数据正则表达式不仅可以判断字符串。还可以从字符串中提取需要的数据。例如字符串订单编号:A20261001需要提取A20261001代码stringtext订单编号:A20261001;MatchmatchRegex.Match(text,A\d);Console.WriteLine(match.Value);输出A20261001解析A表示固定字符。\d表示一个或者多个数字。所以A20261001符合规则。八、Matches获取多个匹配结果如果字符串中存在多个目标可以使用Matches。例如stringtext产品A100 产品A200 产品A300;MatchCollectionmatchesRegex.Matches(text,A\d);foreach(Matchiteminmatches){Console.WriteLine(item.Value);}输出A100 A200 A300Matches可以一次获取所有符合规则的数据。九、Replace替换字符串Regex除了匹配和提取还可以替换字符串。例如删除字符串中的数字。原数据abc123代码stringtextabc123;stringresultRegex.Replace(text,\d,);Console.WriteLine(result);输出abc执行过程找到1 2 3替换为空。最终abc十、正则表达式在工业项目中的应用作为C#上位机开发人员正则表达式在实际项目中非常常见。1、PLC通信数据解析例如PLC发送TEMP:25.6可以使用Regex.Match(data,\d\.\d)提取25.62、串口数据处理设备发送ID:001 OK可以通过\d提取0013、机器视觉项目图片管理视觉检测保存图片NG_001.jpg NG_002.jpg可以使用NG_\d\.jpg判断NG图片。十一、总结通过学习C#正则表达式可以发现Regex是一种非常方便的字符串处理工具。它主要用于字符匹配数据验证数据提取字符替换常用方法方法作用IsMatch判断是否匹配Match获取一个结果Matches获取多个结果Replace替换内容在C#上位机开发、PLC通信、机器视觉项目中正则表达式可以帮助我们快速处理各种字符串数据。虽然正则表达式语法看起来比较复杂但是掌握常用规则以后可以大幅提高开发效率。