zoukankan      html  css  js  c++  java
  • 正则表达式基本用法

    说到正则表达式,大家就会想到那像火星文一样的正则表达式字符串。虽然看起来很奇怪,但是一个个都搞清楚那些东西分别表示什么意思的时候,会发现这东西其实也不难。说干就干,我们来一个个的理解。

    先弄点数据

    string input = "http://www.tansea.cn/23 233【个人博客】23333【http©双子宫殿】";
    List<string> pattern = new List<string>();

    先来个最简单的开个味,太深了都没有兴趣往下看了

    pattern.Add("http");//常量匹配 result = 2

    没有任何的正则表达式的元字符(也就是保留字),http在input里面有2个,所以匹配到了2条

    基础篇

    一、基本语义描述符

    1、d(数字字符)与D(非数字字符)

    pattern.Add("233\d");//匹配233+数字字符 result=1
    pattern.Add("233\D");//匹配233+非数字字符 result=1

    2、w(字母数字下划线)与W(非字母数字下划线)

    pattern.Add("\w");//匹配字母+数字+下划线 result=36
    pattern.Add("\W");//不匹配字母+数字+下划线 result=11

    注意:实测w是能匹配到中文的

    3、s(空白字符)与S(非空白字符)

    空白字符包括制表符、换行符、垂直制表符、换页符、回车符

    复制代码
    pattern.Add("	");//匹配制表符 等价于x09
    pattern.Add("
    ");//匹配换行符 等价于x0A
    pattern.Add("v");//匹配垂直制表符 等价于x0B
    pattern.Add("f");//匹配换页符 等价于x0C
    pattern.Add("
    ");//匹配回车符 等价于x0D
    pattern.Add("\s");//匹配任何空白字符 等价于[	
    vf
    ]
    pattern.Add("\S");//匹配任何非空白字符 等价于[	
    vf
    ]
    复制代码

    到这里就需要说明一下了,和\的区别

    是C#的转义符,如果要让C#把当字符处理,要使用\

    或者在字符串前使用@告诉C#这个字符串的反斜杠都当字符处理

    pattern.Add(@"s");

    注意:如果一个字符串里面有多个,有表示转义符,也有表示字符的,那就不能在字符串之前用@,只能用\来区分

    4、.(任何字符,除 )

    pattern.Add(".");//匹配除 "
    " 之外的任何字符 result=49

    5、xXX(单字节)与uXXXX(双字节)

    xXX单字节字符,字符对应转义值可以查ASCII码表

    pattern.Add("x61");//匹配单字节字符(x61=a) result=2
    pattern.Add("x20");//匹配单字节字符(x20=空格) result=1

    uXXXX双字节字符,除常用字符之外的所有字符,包括各种不常用字符和各国语言字符等等

    pattern.Add("u00A9");//匹配双字节(u00A9=©) result=1
    pattern.Add("[u4e00-u9fa5]");//匹配双字节([u4e00-u9fa5]=汉字) result=8

    二、定位描述符

    1、^ (匹配字符串的开始位置)

    pattern.Add("^http");//开始位置匹配 result = 1
    pattern.Add("^tansea");//开始位置匹配 result = 0

    input确实是以http开头的,所以匹配到了1条,而下面那条语句没有匹配到记录

    2、$(匹配字符串的结束位置)

    pattern.Add("】$");//结束位置匹配 result = 1

    3、(空格)与B(非空格)

    pattern.Add("23\b");//匹配23+空格 result=1
    pattern.Add("23\B");//匹配23+非空格 result=2

    三、重复描述符

    1、*(匹配0-∞次  等价于{0,})

    pattern.Add("233*");//以23开头,后面接0到n个3匹配 result=3

    匹配到23、233、23333三条记录

    2、+(匹配1-∞次  等价于{1,})

    pattern.Add("233+");//以23开头,后面接1到n个3匹配 result=2

    匹配到233、23333两条记录

    3、?(匹配0-1次  等价于{0,1})

    pattern.Add("233?");//以23开头,后面接0到1个3匹配 result=3

    匹配到23、233、233(23333前面部分)三条记录

    4、{n}(匹配n次,n>0)

    pattern.Add("233{1}");//以23开头,后面接1个3匹配 result=2

    匹配到233、233(23333前面部分)两条记录

    5、{n,}(匹配n-∞次,n>0)

    pattern.Add("233{1,}");//以23开头,后面接1到无限个3匹配 result=2

    匹配到233、23333两条记录

    6、{n,m}(匹配n-m次,n>0 且 n<=m)

    pattern.Add("233{2,3}");//以23开头,后面接2到3个3匹配 result=1

    匹配到23333一条记录

    四、选择描述符

    1、|(或操作)

    pattern.Add("com|cn|net");//或条件 result=1

    2、[](IN操作,匹配所包含的任意一个字符)

    pattern.Add("[人从众]");//IN条件 result=1

    IN条件与或条件的区别:或条件是支持多字符,将一个段做为一个整体而IN条件只支持单字符

    pattern.Add("[^人从众]");//NOT IN条件 result=46
    pattern.Add("[o-t]");//BETWEEN条件 匹配小写o到小写t result=8
    pattern.Add("[^o-t]");//NOT BETWEEN条件 匹配非小写o到小写t result=39

    五、组(...)与非捕获组(?:...)

    正则表达式会将刮号里的内容单独保存成一个组,并且匹配到的组可以反向引用, 是引用第n组

    pattern.Add("\.(.{1,6})");//.开头取6个字符 result=2

    结果:Group[0]=.tansea Group[1]=tansea 

              Group[0]=.cn/23  Group[1]=cn/23 

    注意:/23后面是有一个空格的,是取了6个字符

    如果不想把刮号里的内容保存到组,可以用非捕获组

    pattern.Add("\.(?:.{1,6})");

    六、贪婪与非贪婪

    正则表达式默认为贪婪模式,可以在重复描述符后加上?改成非贪婪模式

    pattern.Add(".*233");//结果为"http://www.tansea.cn/23 233【个人博客】233"一条记录
    pattern.Add(".*?233");//结果为"http://www.tansea.cn/23 233"、"【个人博客】233"两条记录

    七、回溯与非回溯

    正则表达式默认为回溯模式,可以(?>...)改成非回溯模式

    在贪婪模式情况下,非回溯模式不会再重新去匹配,而是接着继续匹配

    pattern.Add("(.*)233");//结果为"http://www.tansea.cn/23 233【个人博客】233"
    pattern.Add("(?>.*)233");//结果为空

    八、正向预搜索(?=...)与反向预搜索(?<=...)

    1、正向预搜索

    pattern.Add("\d{3}(?=【个人博客】)");//匹配3个数字开头后面是"【个人博客】"
    pattern.Add("\d{3}(?!=【个人博客】)");//匹配3个数字开头后面不是"【个人博客】"

    2、反向预搜索

    pattern.Add("(?<=【个人博客】)\d{3}");//匹配"【个人博客】"开头后面是3个数字
    pattern.Add("(?!<=【个人博客】)\d{3}");//匹配不是"【个人博客】"开头后面是3个数字

    可以看出来,当判断条件在后面时,我们用的是正向预搜索,反之则相反。

    预搜索刮号内的内容不会匹配

    来看看结果吧

    复制代码
    pattern.ForEach(p =>
    {
        MatchCollection matches = Regex.Matches(input, p);
        Console.WriteLine("Count:" + matches.Count);
        foreach (Match item in matches)
            //Console.WriteLine("Value:" + item.Groups[0].Value);
            Console.WriteLine("Value:" + item.Groups[0].Value + "=>" + item.Groups[1].Value);
    });
    复制代码

    实战篇

    一、Escape和Uescape

    复制代码
    string input = @"dhttp://www.tansea.cn2017";
    string pattern = "\d";
    string replacement = "X";
    string split = ":|/|\.";
    //d是元符号,将元符号转换成原义解释
    string escapePattern = Regex.Escape(pattern);
    Console.WriteLine(Regex.Match(input, escapePattern).Groups[0].Value);//result=d
    //\d是原义,将原义转换成元符号解释
    string unescapePattern = Regex.Unescape(escapePattern);
    Console.WriteLine(Regex.Match(input, unescapePattern).Groups[0].Value);//result=2
    复制代码

    二、IsMatch

    Regex.IsMatch(input, pattern);//是否找到匹配项

    三、Match

    Match match = Regex.Match(input, pattern);//返回匹配到的第一项
    Console.WriteLine(match.Value);

    四、Matches

    MatchCollection matches = Regex.Matches(input, pattern);//返回匹配到的所有项
    foreach (Match item in matches)
        Console.WriteLine(item.Value);

    五、Replace

    复制代码
    Console.WriteLine(Regex.Replace(input, pattern, replacement));//用指定的字符串替换匹配到的项
    Console.WriteLine(Regex.Replace(input, pattern, m =>
    {
        string result = string.Empty;
        switch (m.Value)
        {
            case "2": result = "贰"; break;
            case "0": result = "零"; break;
            case "1": result = "壹"; break;
            case "7": result = "柒"; break;
        }
        return result;
    }));//用委托返回的字符串替换匹配到的项
    复制代码

    六、Split

    List<string> inputs = Regex.Split(input, split).ToList();//以匹配到的项的位置为基本,拆分字符串
    inputs.ForEach(i => Console.WriteLine(i));
  • 相关阅读:
    【UNIX环境高级编程】线程同步
    死锁
    Shell Script的默认变量
    高通平台读写nv总结
    PLMN概念和应用设置
    win10间歇性的找不到usb设备
    (转)查询或修改iPhone的短信服务中心号码(iOS通用)
    (转)CS域和PS域
    SSL&HTTPS简单介绍
    WAV和PCM的关系和区别
  • 原文地址:https://www.cnblogs.com/liujianshe1990-/p/12144893.html
Copyright © 2011-2022 走看看