当前位置: 首页 > 科技观察

C#正则表达式,你知道几个?

时间:2023-03-11 23:55:19 科技观察

本文转载自微信公众号《CSharp编程百科全书》,作者zls365。转载本文请联系CSharp编程百科公众号。最近写爬虫需要用到正则表达式。有段时间没用过正则表达式了,现在感觉有点忘乎所以了。现在我需要查询一些信息。为了避免以后出现这种情况,这里记录一些正则表达式的基本使用方法,并附上小例子。以便大家以后在使用的时候能够一目了然的知道他的用途,节省开发的时间,分享给大家。正则元字符在讨论正则表达式之前,让我们先了解一下通配符。我想每个人都使用过通配符。通配符主要包括星号(*)和问号(?),用于模糊搜索文件。在winodws中,我们经常使用搜索来查找一些文件。如:*.jpg、XXX.docx快速查找文件。其实正则表达式和我们的通配符很相似,也是用特定的字符来匹配我们要查询的内容信息。以下代码区分大小写。常用的元字符惰性限定符捕获分组拿到上面的秘籍后,我们就可以试试了……C#中正则表达式的使用主要是通过Regex类来实现的。命名空间:使用System.Text.RegularExpressions。常用方法:在使用正则表达式之前,我们先看一下“@”符号的用法。学过C#的都知道,C#中的字符串常量可以用@开头声明。这样做的好处是转义序列“不”处理,“原样”输出,即我们不需要在转义符后面加上\(反向Slanted),可以轻松编码。如:stringfilePath=@"c:\Docs\Source\CK.txt"//而不是"c:\\Docs\\Source\\CK.txt"如果要在用@引号括起来的字符串中包含一个double,你需要使用两对双引号。这时候不能用\转义酷引号,因为\的转义使用已经被@“屏蔽”了。如:stringstr=@"""Ahoy!""criedthecaptain."//输出为:"Ahoy!criedthecaptain.字符串匹配:在实际项目中,我们经常需要对用户输入的信息进行校验。如:匹配用户输入的内容是否为数字,是否为有效手机号码,邮箱地址是否合法……等。示例代码:stringRegexStr=string.Empty;#regionstringmatchingRegexStr="^[0-9]+$";//匹配字符串的首尾是否为0-9的数字[定位字符]Console.WriteLine("判断'R1123'是否为数字:{0}",Regex.IsMatch("R1123",RegexStr));Console.WriteLine("判断'1123'是否为数字:{0}",Regex.IsMatch("1123",RegexStr));RegexStr=@"\d+";//中间是否有数字匹配字符串(这里没有从头开始匹配,只要任意位置有数字即可)Console.WriteLine("'R1123'是否包含数字:{0}",Regex.IsMatch("R1123",正则表达式);Console.WriteLine("Does'博客园'containnumbers:{0}",Regex.IsMatch("博客园",RegexStr));//感谢@zhoumy提醒..错误码已修改RegexStr=@"^HelloWorld[\w\W]*";//任意以HelloWorld开头的字符(\w\W:组合可以匹配任意字符)Console.WriteLine("Does'HeLLOWORLDxxhhxx'startwithHelloWorld:{0}",Regex.IsMatch("HeLLOWORLDxxhhxx",RegexStr,RegexOptions.IgnoreCase));Console.WriteLine("Does'LLOWORLDxxhhxx'startwithHelloWorld:{0}",Regex.IsMatch("LLOWORLDxxhhxx",RegexStr,RegexOptions.IgnoreCase));//RegexOptions.IgnoreCase:指定不区分大小写的匹配。#endregion显示结果:字符串搜索:示例代码:stringRegexStr=string.Empty;#区域字符串搜索stringLinkA="百度";RegexStr=@"href=""[\S]+""";//""Match"Matchmt=Regex.Match(LinkA,RegexStr);Console.WriteLine("{0}.",LinkA);Console.WriteLine("获取href中的值:{0}.",mt.Value);RegexStr=@"[\S]+";//:匹配h中除2以外的值,3,4,5,6,:h匹配包含括号中元素的字符Console.WriteLine("{0}.GetH1Value:{1}","

Title

",Regex.Match("

Title

",RegexStr,RegexOptions.IgnoreCase).Value);Console.WriteLine("{0}.GetH1值:{1}","

下标

",Regex.Match("

subscript

",RegexStr,RegexOptions.IgnoreCase).Value);//RegexOptions.IgnoreCase:指定不区分大小写的匹配。RegexStr=@"ab\w+|ij\w{1,}";//匹配ab和字母或ij和字母Console.WriteLine("{0}.多选结构:{1}","abcd",Regex.Match("abcd",RegexStr).Value);Console.WriteLine("{0}。多选结构:{1}","efgh",Regex.Match("efgh",RegexStr).Value);Console.WriteLine("{0}.多选结构:{1}","ijk",Regex.Match("ijk",RegexStr).Value);RegexStr=@"张三?峰";//?匹配前零次或一次的子表达式。Console.WriteLine("{0}。可选元素:{1}","张三丰",Regex.Match("张三丰",RegexStr).Value);Console.WriteLine("{0}。可选元素:{1}","张峰",Regex.Match("张峰",RegexStr).Value);Console.WriteLine("{0}。可选元素:{1}","张飞",Regex.Match("张飞",RegexStr.Value);/*例如:July|Jul  可以简写为  July?4th|4  可以简写为  4(th)?*///匹配特殊字符RegexStr=@"Asp\.net";//匹配Asp.net字符,因为。是元字符,他会匹配除换行符外的任何字符。这里我们只需要他去匹配.特点。所以你需要转义\.这意味着匹配。字符Console.WriteLine("{0}.匹配Asp.net字符:{1}","JavaAsp.netSQLServer",Regex.Match("JavaAsp.netSQLServer",RegexStr).Value);Console.WriteLine("{0}.匹配Asp.net字符:{1}","C#Java",Regex.Match("C#Java",RegexStr).Value);#endregion显示结果:贪心和惰性stringf="fooot";//贪心匹配RegexStr=@"f[o]+";Matchm1=Regex.Match(f,RegexStr);Console.WriteLine("{0}贪心匹配(匹配尽可能多的字符):{1}",f,m1.ToString());//惰性匹配RegexStr=@"f[o]+?";Matchm2=Regex.Match(f,RegexStr);Console.WriteLine("{0}惰性匹配(匹配尽可能少的重复次数):{1}",f,m2.ToString());显示结果:从上面的例子中,我们很容易看出贪心和惰性的区别,它们的名字也很形象。贪心匹配:匹配尽可能多的字符。惰性匹配:匹配尽可能多的字符。aspossiblePossiblelesscharacters.(exp)分组我们在爬取的时候经常会在A中得到一些有用的信息,比如href、title和显示内容等。stringTaobaoLink="淘宝";RegexStr=@"]+href=""(\S+)""[^>]+title=""([\s\S]+?)"""[^>]+>(\S+)";Matchmat=Regex.Match(TaobaoLink,RegexStr);for(inti=0;iexp)groupname当我们匹配过多的group信息时,在某些场合只需要取Some信息集。此时我们可以命名该组。通过组名快速提取对应信息。stringResume="基本信息姓名:CK|求职意向:.NET软件工程师|性别:男|学历:本专|出生日期:1988-08-08|户籍:湖北.孝感|邮箱:9245162@qq.com|手机:15000000000";RegexStr=@"姓名:(?[\S]+)\|\S+性别:(?[\S]{1})\|学历:(?[\S]{1,10})\|出生日期:(?[\S]{10})\|[\s\S]+手机:(?[\d]{11})";Matchmatc=Regex.Match(Resume,RegexStr);Console.WriteLine("姓名:{0},电话号码:{1}",matc.Groups["name"].ToString(),matc.Groups["phone"].ToString());显示结果:通过(?exp),可以方便的给组命名。然后通过Groups["name"]获取分组值。获取href值stringPageInfo=@"百度淘宝博客园google

整租合租出租二手房商铺出租
";RegexStr=@"]+href=""(?[\S]+?)"""[^>]*>(?[\S]+?)";MatchCollectionmc=Regex.Matches(PageInfo,RegexStr);foreach(Matchiteminmc){Console.WriteLine("href:{0}--->text:{1}",item.Groups["href"].ToString(),item.Groups["text"].ToString());}显示结果:ReplaceReplacementstring用户在输入信息的时候偶尔会包含一些敏感词,这时候我们就需要将敏感词替换掉stringPageInputStr="Damn.TMMD|Damn";Regexrep_regex=newRegex(RegexStr);Console.WriteLine("用户输入信息:{0}",PageInputStr);Console.WriteLine("页面显示信息:{0}",rep_regex.Replace(PageInputStr,"***"));显示结果:部分敏感词直接替换成***splitstringSplitInputStr="1xxxxx.2ooooo.3eeee.4kkkkkk.";RegexStr=@"\d";Regexspl_regex=newRegex(RegexStr);string[]str=spl_regex.Split(SplitInputStr);foreach(stringiteminstr){Console.WriteLine(item);}显示结果:根据数字截取字符串。