现在的位置: 首页 > 综合 > 正文

C#中的正则表达式(1)-基础篇

2012年02月20日 ⁄ 综合 ⁄ 共 4507字 ⁄ 字号 评论关闭

在学习本文之前,可以先阅读和练习下下面链接文档,它是我读过的正则中最好的一篇文章:

.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             /*反向预搜索   类似*/

 

 

抱歉!评论已关闭.