Fork me on GitHub

项目中有些时候需要用到正则表达式,但是自己对正则表达式不熟悉,每次学习完,过一段时间(长时间)不用,就又忘了,每次需要用到的时候都需要百度下,比较麻烦,这里把C#中经常用到的正则表达式做下总结。

正则表达式常用的环境

爬虫、网站数据验证、日志分析、字符串替换、获取子字符串、文本处理、字符串处理等

正则基础

1. []方括号表示匹配可以匹配方括号中的任意点单个字符,方括号只允许匹配单个字符。
2. | 或表示两项之间的一个选择,它不能和方括号使用,只能和小括号使用。
3. ()小括号表示一个子表达式的开始和结束位置
4. ^ 否符号,如果用在方括号内,“^”表示不想要匹配的字符。
5. . 点字符:匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。
6. 定位符:定位符使您能够将正则表达式固定到行首或行尾,^ 和 $ 分别指字符串的开始与结束
7. 限定符:限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配

  • * 表示匹配前面的子表达式0次或多次
  • ?表示匹配前面的子表达式0次或一次
  • + 表示匹配前面的子表达式至少匹配一次
  • {n} 表示匹配前面的子表达式n次
  • {n,m} 表示匹配前面的子表达式从n次到m次

8. 转义字符

  • \d 匹配一个数字字符。等价于 [0-9]。
  • \D 匹配一个非数字字符。等价于 [^0-9]。
  • \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
  • \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
  • \w 匹配字母、数字、下划线。等价于'[A-Za-z0-9_]'。
  • \W 匹配非字母、数字、下划线。等价于 '[^A-Za-z0-9_]'。
  • \n 匹配一个换行符
  • \r 匹配一个回车符
  • \b 匹配一个单词边界,即字与空格间的位置。匹配单词的开始或者结尾部分
  • \B 匹配非单词边界 匹配单词的中间部分,例如:匹配:Chapter中的apt,/\Bapt/

9. 捕获组:除(Expression)和(?<name>Expression)语法外,其它的(?...)语法都不是捕获组。

    var str = "Is is the cost of of gasoline going up up";
    var patt1 = @"\b([a-z]+) \1\b";
    var matchDatas1 = Regex.Matches(str, patt1).Select(x => x.Value);
    Console.WriteLine(JsonConvert.SerializeObject(matchDatas1));//["of of","up up"]

捕获组的顺序是从左到右,从1开始,0代表整体,这里的\1就是分组的第一个自匹配项,在Replace中可以用$1操作

    string a = @"(020)76544567";
    string b = @"\((\d{3})\)(\d{8})";
    var c = new Regex(b);
    string d = c.Replace(a, "$0-$1-$2");
    Console.WriteLine(d);//(020)76544567-020-76544567    

10.选择
用圆括号将所有选择项括起来,相邻的选择项之间用|分割。用圆括号会有一个副作用,使相关的匹配会被缓存,缓存的数据会占用内存,降低匹配效率。此时可用?:放在第一个选项前来消除这种副作用。
可以使用非捕获元字符 ?:、?= 或 ?! 来重写捕获,忽略对相关匹配的保存。

  • (?:pattern)匹配pattern,但不捕获匹配结果。'industr(?:y|ies)' 例如:匹配'industry'或'industries'。
  • (?=pattern)零宽度正向预查,不捕获匹配结果。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”
  • (?!pattern)正向否定预查,不捕获匹配结果。例如,“Windows(?!95|98|NT|2000)”不能匹配“Windows2000”中的“Windows”,但能匹配“Windows3.1”中的“Windows”

常用正则表达式

1. 非空字符串,适用于匹配单词,关键字等 @"\S+"

2. html标签 @"<[^>]+>"

  • 匹配带连接的a标签 @"<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>(?:(?!</?a\b).)*)</a>"
  • 匹配链接 "(href|src)\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))"
  • 匹配图片 "<img(.*?)>"
  • 任意标签: @"\<[^\>]+\>([^\<]+)\<\/[^\>]+\>"

3. Email地址:@"\w+@(\w+\.)+\w{2,3}";

4. 域名:@"[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?";

5. InternetURL:@"[a-zA-z]+://[^\s]*" 或 @"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$";

6. 手机号码:@"^([1][3,4,5,6,7,8,9])\d{9}$";

7. 国内电话号码:@"\d{3}-\d{8}|\d{4}-\d{7}";

8. 身份证:@"(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)";

9. 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 6-10 之间):@"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{6,10}$";

10. 简单密码:@"\w{6,10}";

11. 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):@"^[a-zA-Z][a-zA-Z0-9_]{4,15}$";

12. 钱:@"^[0-9]+(.[0-9]+)?$";

13. QQ:@"[1-9][0-9]{4,}";

13. 邮政编码:@"[1-9]\d{5}(?!\d)";

14. IP:@"^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$";

15. 数字: @"^\d+$";

16. 字母:@"^[a-zA-Z]+$";

17. 获取Html中的文本内容

        public static string GetHtmlText(string html)
        {
            html = Regex.Replace(html, @"<[^<>]+>", "", RegexOptions.IgnoreCase);
            html = html.Replace("\r\n", "").Replace("\r", "").Replace("&nbsp;", "").Replace(" ", "");
            return html;
        }

 18.隐藏手机号中间几位数

Regex.Replace(手机号, "(\\d{3})\\d{4}(\\d{4})", "$1****$2");

 

posted on 2019-07-16 17:52  lingfeng95  阅读(1333)  评论(0编辑  收藏  举报