项目中有些时候须要用到正则表达式,可是本身对正则表达式不熟悉,每次学习完,过一段时间(长时间)不用,就又忘了,每次须要用到的时候都须要百度下,比较麻烦,这里把C#中常常用到的正则表达式作下总结。html
爬虫、网站数据验证、日志分析、字符串替换、获取子字符串、文本处理、字符串处理等正则表达式
1. []方括号表示匹配能够匹配方括号中的任意点单个字符,方括号只容许匹配单个字符。
2. | 或表示两项之间的一个选择,它不能和方括号使用,只能和小括号使用。
3. ()小括号表示一个子表达式的开始和结束位置
4. ^ 否符号,若是用在方括号内,“^”表示不想要匹配的字符。
5. . 点字符:匹配除换行符 \n 以外的任何单字符。要匹配 . ,请使用 \. 。
6. 定位符:定位符使您可以将正则表达式固定到行首或行尾,^ 和 $ 分别指字符串的开始与结束
7. 限定符:限定符用来指定正则表达式的一个给定组件必需要出现多少次才能知足匹配缓存
8. 转义字符学习
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.选择
用圆括号将全部选择项括起来,相邻的选择项之间用|分割。用圆括号会有一个反作用,使相关的匹配会被缓存,缓存的数据会占用内存,下降匹配效率。此时可用?:放在第一个选项前来消除这种反作用。
可使用非捕获元字符 ?:、?= 或 ?! 来重写捕获,忽略对相关匹配的保存。url
1. 非空字符串,适用于匹配单词,关键字等 @"\S+"spa
2. html标签 @"<[^>]+>"日志
3. Email地址:@"\w+@(\w+\.)+\w{2,3}";code
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]+$";