建议先看视频,然后再看文档,我当初就是嫌弃文字太长,一直断断续续的看,后来看了C#的基础视频,其实也没多少。网上的免费视频会讲解基础的,读懂了基础,看文字也不累了。查找非匹配的知识点没加上,有时间补上。

文章导读

     正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串。正则表达式无疑是处理文本最有力的工具,而.NET提供的Regex类实现了验证正则表达式的方法。Regex 类表示不可变(只读)的正则表达式。它还包含各种静态方法,允许在不显式创建其他类的实例的情况下使用其他正则表达式类。


基础梳理

java正则表达式不以数字开头 正则不能以数字1开头_正则表达式

java正则表达式不以数字开头 正则不能以数字1开头_元字符_02

说明:

由于在正则表达式中“ \ ”、“ ? ”、“ * ”、“ ^ ”、“ $ ”、“ + ”、“(”、“)”、“ | ”、“ { ”、“ [ ”等字符已经具有一定特殊意义,如果需要用它们的原始意义,则应该对它进行转义,例如 希 望在字符串中至少有一个“ \ ”,那么正则表达式应该这么写: \\+ 。

数字举例

@即我们不需要对转义字符加上 \ (反斜扛)
            // 以数字开头,以数字结尾
            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());