建议先看视频,然后再看文档,我当初就是嫌弃文字太长,一直断断续续的看,后来看了C#的基础视频,其实也没多少。网上的免费视频会讲解基础的,读懂了基础,看文字也不累了。查找非匹配的知识点没加上,有时间补上。
文章导读
正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串。正则表达式无疑是处理文本最有力的工具,而.NET提供的Regex类实现了验证正则表达式的方法。Regex 类表示不可变(只读)的正则表达式。它还包含各种静态方法,允许在不显式创建其他类的实例的情况下使用其他正则表达式类。
基础梳理
说明:
由于在正则表达式中“ \ ”、“ ? ”、“ * ”、“ ^ ”、“ $ ”、“ + ”、“(”、“)”、“ | ”、“ { ”、“ [ ”等字符已经具有一定特殊意义,如果需要用它们的原始意义,则应该对它进行转义,例如 希 望在字符串中至少有一个“ \ ”,那么正则表达式应该这么写: \\+ 。
数字举例
@即我们不需要对转义字符加上 \ (反斜扛)
// 以数字开头,以数字结尾
Regex reg = new Regex(@"^[0-9]*$");
//n位的数字{n}匹配n次
Regex reg = new Regex(@"^\d{n}$");
//至少n位的数字{n,}
Regex reg = new Regex(@"^\d{n,}$");
//m-n位的数字{m,n}
Regex reg = new Regex(@"^\d{m,n}$");
//零和非零开头的数字
Regex reg = new Regex(@"^(0|[1-9][0-9]*)$");
//非零开头的最多带两位小数的数字+匹配前面的一次或多次的子表达式
// ?匹配前面的或0次或一次的子表达式
Regex reg = new Regex(@"^([1-9][0-9]*)+(.[0-9]{1,2})?$");
//带1-2位小数的正数或负数
Regex reg = new Regex(@"^(\-)?\d+(\.\d{1,2})?$");
//正数、负数、和小数(\-|\+)(负数或者正数)
Regex reg = new Regex(@"^(\-|\+)?\d+(\.\d+)?$");
//有两位小数的正实数
Regex reg = new Regex(@"^[0-9]+(.[0-9]{2})?$");
//有1~3位小数的正实数
Regex reg = new Regex(@"^[0-9]+(.[0-9]{1,3})?$");
//非零的正整数*匹配前面2次或多次的
Regex reg = new Regex(@"^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$");
(exp)分组
在做爬虫时我们经常获得A中一些有用信息。如href,title和显示内容等。
在正则表达式里使用()包含的文本自动会命名为一个组。
说明:反义元字符所对应的元字符都能组合匹配任意字符。如:[\w\W],[\s\S],[\d\D]..
string TaobaoLink = "<a href=\"http://www.taobao.com\" title=\"淘宝网 - 淘!我喜欢\" target=\"_blank\">淘宝</a>";
RegexStr = @"<a[^>]+href=""(\S+)""[^>]+title=""([\s\S]+?)""[^>]+>(\S+)</a>";
Match mat = Regex.Match(TaobaoLink, RegexStr);
for (int i = 0; i < mat.Groups.Count; i++)
{
Console.WriteLine("第"+i+"组:"+mat.Groups[i].Value);
}
(?exp) 分组取名
通过(?<name>exp)可以很轻易为分组取名。然后通过Groups["name"]取得分组值。
当我们匹配分组信息过多后,在某种场合只需取当中某几组信息。这时我们可以对分组取名。通过分组名称来快速提取对应信息。
string Resume = "基本信息姓名:CK|求职意向:.NET软件工程师|性别:男|学历:本专|出生日期:1988-08-08|户籍:湖北.孝感|E - Mail:9245162@qq.com|手机:15000000000";
RegexStr = @"姓名:(?<name>[\S]+)\|\S+性别:(?<sex>[\S]{1})\|学历:(?<xueli>[\S]{1,10})\|出生日期:(?<Birth>[\S]{10})\|[\s\S]+手机:(?<phone>[\d]{11})";
Match matc = Regex.Match(Resume, RegexStr);
Console.WriteLine("姓名:{0},手机号:{1}", matc.Groups["name"].ToString(), matc.Groups["phone"].ToString());