正则表达式基本用法
来源:https://www.cnblogs.com/TanSea/p/6924177.html ? 说到正则表达式,大家就会想到那像火星文一样的正则表达式字符串。虽然看起来很奇怪,但是一个个都搞清楚那些东西分别表示什么意思的时候,会发现这东西其实也不难。说干就干,我们来一个个的理解。 先弄点数据 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("233d");//匹配233+数字字符 result=1 pattern.Add("233D");//匹配233+非数字字符 result=1 2、w(字母数字下划线)与W(非字母数字下划线) pattern.Add("w");//匹配字母+数字+下划线 result=36 pattern.Add("W");//不匹配字母+数字+下划线 result=11 注意:实测w是能匹配到中文的 3、s(空白字符)与S(非空白字符) 空白字符包括制表符、换行符、垂直制表符、换页符、回车符 pattern.Add("t");//匹配制表符 等价于x09 pattern.Add("n");//匹配换行符 等价于x0A pattern.Add("v");//匹配垂直制表符 等价于x0B pattern.Add("f");//匹配换页符 等价于x0C pattern.Add("r");//匹配回车符 等价于x0D pattern.Add("s");//匹配任何空白字符 等价于[tnvfr] pattern.Add("S");//匹配任何非空白字符 等价于[tnvfr] 到这里就需要说明一下了,和的区别 是C#的转义符,如果要让C#把当字符处理,要使用 或者在字符串前使用@告诉C#这个字符串的反斜杠都当字符处理 pattern.Add(@"s"); 注意:如果一个字符串里面有多个,有表示转义符,也有表示字符的,那就不能在字符串之前用@,只能用来区分 4、.(任何字符,除n) pattern.Add(".");//匹配除 "n" 之外的任何字符 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(空格)与B(非空格) pattern.Add("23b");//匹配23+空格 result=1 pattern.Add("23B");//匹配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是引用第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,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)); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |