在学习本文之前,可以先阅读和练习下下面链接文档,它是我读过的正则中最好的一篇文章:
.NET进阶系列之一:C#正则表达式整理备忘>>传送门
依靠该篇博文,基本学会了正则表达式!感谢Morven.Huang博主!
WinForm代码片段需要引用的命名空间:
1 using System.Text.RegularExpressions;
统计匹配弹出框:
1 // MessageBox.Show("r match:"+r.Match(i).Value); 2 3 // MessageBox.Show(r.IsMatch(i).ToString() + "," + r.Matches(i).Count);
相关练习(参考自上述文章自己的练习):
1.@ /的用法:
1 /*@*/ 2 //在相关有"/","""等表达符号特殊字符中要用到; 3 // "/"用于转义
2.基本语法字符:
1 /*基本字符语法*/ 2 //string i = "123?!_"; 3 //Regex r = new Regex(@"\d");//true 数字 4 //Regex r = new Regex(@"\D");//true 非数字 \d的补集 5 //Regex r = new Regex(@"\w");//true 单词字符,a-z,A-Z,0-9,_ 6 //Regex r = new Regex(@"\W");//true \w的补集 7 //Regex r = new Regex(@"\s");//false 空白字符(包括换行符 \n,回车符 \r,制表符 \t,垂直制表符 \v,换页符 \f) 8 //Regex r = new Regex(@"\S");//true \s的补集 9 //Regex r = new Regex(".");//true 除换行符\n外的任意字符 10 //Regex r = new Regex("[...]");//false 匹配[]内所列出的所有字符 11 //Regex r = new Regex("[5-6]");//flase 12 //Regex r = new Regex("[^...]");//true 匹配非[]内所列出的字符
3.定位字符:
1 /*定位字符*/ 2 //string i = "Live for nothing,Die for nothing!"; 3 //Regex r = new Regex("^for nothing");//flase ^ 表示其后的字符串必须位于字符串开始处 4 //Regex r = new Regex("^Live for");//true 5 6 //Regex r = new Regex("nothing$");//false $ 表示其前面的字符必须位于字符串结束处 7 //Regex r = new Regex("nothing!$");//true 8 9 /*string i = @"Live for nothing, 10 Die for nothing!";//多行*/ 11 /*Regex r = new Regex(@"^Live for nothing, 12 Die for nothing!");//true*/ 13 //Regex r = new Regex("^Live for nothing,\r\nDie for nothing!$");//true 14 //Regex r = new Regex("^Live for nothing,\r\n$",RegexOptions.Multiline);//false ??? 15 //对于一个多行字符串,在设置了Multiline选项之后,^和$将出现多次匹配 16 17 //string i = "Live for nothing,Die for no thing!"; 18 //Regex r = new Regex(@"thing\b");//true,2; b:匹配一个单词的边界;B:匹配一个非单词的边界 19 //Regex r = new Regex(@"\bthing\b");//true,1; 20 //Regex r = new Regex(@"\bfor nothing");//true,1; 21 //Regex r = new Regex(@"\bfor nothing\b");//true,1;
4.重复描述字符:
1 /*重复描述字符*/ 2 //string i = "1024";//true,1 3 //string i = "-1023";//true,1 4 //string i = "-12.12";//false 5 //Regex r = new Regex(@"^\+?\-?[0-9].?\d{3}$");//匹配+或者- 1(.)000 6 7 //string i = "dong3580@163.com";//true ,1 8 //string i = "dong3580@"; 9 //Regex r = new Regex(@"^\w+@\w+.[a-z]+");//验证email地址 10
5.择一匹配:
1 /*择一匹配 ( | ) or语句*/ 2 //string i = "0"; //F T 1 3 //string i = "0.23"; //F T 1 4 //string i = "100"; //T F 1 5 //string i = "100.01";//F F 0 6 //string i = "9.9"; //F T 1 7 //string i = "99.9"; //F T 1 8 //string i = "99."; //F F 0 9 //string i = "00.1"; //F F 0 10 //Regex r = new Regex(@"^\+?((100(.0+)*)|([1-9]?[0-9])(\.\d+)*)$");//^\+?((100(\.0)?)|([1-9]?[0-9])(\.\d+)?)$
11 //匹配0到100的数。最外层的括号内包含两部分“(100(.0+)*)”,“([1-9]?[0-9])(\.\d+)*”,这两部分是“OR”的关系,即正则表达式引擎会先尝试匹配100,如果失败,则尝试匹配后一个表达式(表示[0,100)范围中的数字)。
6.组与非捕获组:
1 /*组与非捕获组*/ 2 //string i = "Live for nothing,Die for something!"; 3 //Regex r = new Regex(@"^Live ([a-z]{3}) no([a-z]{5}),Die \1 some\2!$");//True,1 4 //正则表达式引擎会记忆“()”中匹配到的内容,作为一个“组”,并且可以通过索引的方式进行引用。表达式中的“\1”,用于反向引用表达式中出现的第一个组,即粗体标识的第一个括号内容,“\2”则依此类推。 5 6 //Regex r = new Regex(@"^Live for no([a-z]{5}),Die for some\1!$");//True,1 7 //MessageBox.Show("Group1 value:"+r.Match(i).Groups[1].Value);//输出thing 8 //获取组中的内容。注意,此处是Groups[1],因为Groups[0]是整个匹配的字符串,即整个变量x的内容。 9 10 //Regex r = new Regex(@"^Live for no(?<g1>[a-z]{5}),Die for some\1!$"); 11 //MessageBox.Show("Group1 value:"+r.Match(i).Groups[1]+",g1 value:"+r.Match(i).Groups["g1"].Value);//thing,thing;true 1 12 //可根据组名进行索引,使用一下格式为标识一个组的名称(?<groupname>...) 13 14 //string i = "Live for nothing nothing"; 15 /* 16 Regex r = new Regex(@"([a-z]+) \1"); 17 MessageBox.Show("Group1 value:"+r.Match(i).Groups[1].Value);//nothing 18 i = r.Replace(i,"$1"); 19 MessageBox.Show("var i:"+i);//Live for nothing 20 //删除原字符串中重复出现的"nothing".在表达式之外,使用"$1"来引用第一个组,下面则是通过组名来引用. 21 */ 22 23 /* 24 Regex r = new Regex(@"(?<g1>[a-z]+) \1"); 25 MessageBox.Show("Group1 value:"+r.Match(i).Groups["g1"].Value);//thing 26 i = r.Replace(i,"${g1}");//注意组名要用大括号括起来 27 MessageBox.Show("var i:"+i);//Live for nothing 28 */ 29 30 /* 31 Regex r = new Regex(@"^Live for nothing no(?:[a-z]{5})$"); 32 MessageBox.Show("group1 value:"+r.Match(i).Groups[1].Value);//输出为空, 33 //在组前加上"?:"表示这是个"非捕获组",即引擎将不保存改组的内容 34 */
7.贪婪与非贪婪:
1 /*贪婪与非贪婪*/ 2 //string i = "Live for nothing,Die for nothing"; 3 //Regex r = new Regex(@".*thing");//输出的是 Live for nothing,Die for nothing 4 //Regex r = new Regex(@".*?thing");//Live for nothing 5 //正则表达式的引擎是贪婪,只要模式允许,它将匹配尽可能多的字符。通过在“重复描述字符”(*,+)后面添加“?”,可以将匹配模式改成非贪婪。
8.回溯与非回溯:
1 /*回溯与非回溯*/ 2 //Regex r = new Regex(@".*thing,");//Live for nothing //在r1中,“.*”由于其贪婪特性,将一直匹配到字符串的最后,随后匹配“thing”,但在匹配“,”时失败,此时引擎将回溯,并在“thing,”处匹配成功。 3 //Regex r = new Regex(@"(?>.*)thing,");//在r2中,由于强制非回溯,所以整个表达式匹配失败 4 //MessageBox.Show("match value:"+r.Match(i).Value); 5 //使用“(?>…)”方式进行非回溯声明。由于正则表达式引擎的贪婪特性,导致它在某些情况下,将进行回溯以获得匹配, 6
9.正向预搜索,反向预搜索
1 /*正向预搜索,反向预搜索*/ 2 string i = "1024 used 2048 free"; 3 //Regex r = new Regex(@"\d{4}(?= used)");//1024 4 //Regex r = new Regex(@"\d{4}(?! used)");//2048 5 //r1中的正声明表示必须保证在四位数字的后面必须紧跟着“ used”,r2中的负声明表示四位数字之后不能跟有“ used”。 6 //正向预搜索声明格式:正声明 “(?=…)”,负声明 “(?!...)” ,声明本身不作为最终匹配结果的一部分, 7 /*反向预搜索 类似*/