本文转载自微信公众号《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="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="
