收藏 分享(赏)

C#正则表达式快速入门.doc

上传人:dreamzhangning 文档编号:4064612 上传时间:2018-12-06 格式:DOC 页数:19 大小:456.35KB
下载 相关 举报
C#正则表达式快速入门.doc_第1页
第1页 / 共19页
C#正则表达式快速入门.doc_第2页
第2页 / 共19页
C#正则表达式快速入门.doc_第3页
第3页 / 共19页
C#正则表达式快速入门.doc_第4页
第4页 / 共19页
C#正则表达式快速入门.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

1、介绍作者将自己在学习正则表达式中的心得和笔记作了个总结性文章,希望对初学 C#正则表达式的读者有帮助。内容 什么是正则表达式 涉及的基本的类 正则表达式基础知识 构建表达式基本方法 编写一个检验程序 参考资料正文对于初学者看到类似“w+w+.w1,3”这样复杂没有规律的字符,就会莫名产生一种恐惧感。其实正则表达式和字符串(String)的使用同样非常简单。下面让我们逐步地走进正则表达式的世界!什么是正则表达式正则表达式是用来检验和操作字符串的强大工具。简单的理解正则表达式可以认为是一种特殊的验证字符串。正则表达式常见运用是验证用户输入信息格式,比如上面的那组“w1,w1,.w1”,实际上就是验

2、证邮件地址是否合法的;当然正则表达式不仅仅是用于验证,可以说只要运用字符串的地方都可以使用正则表达式;涉及的基本的类正则表达式在英文中写作(Regular Expression) ,根据正则表达式的使用范围和单词意思,.NET 将其命名空间设置为 System.Text.RegularExpressions;在该命名空间内包括了8个基本的类:Capture、CaptureCollection、Group 、GroupCollection、Match、MatchCollection、Regex和 RegexCompilationInfo 如图所示;图1 MSDN Library 中正则表达式命名

3、空间Capture 用于单个表达式捕获结果CaptureCollection 用于一个序列进行字符串捕获Group 表示单个捕获的结果GroupCollection 表示捕获组的集会Match 表示匹配单个正则表达式结果MatchCollection 表示通过迭代方式应用正则表达式到字符串中Regex 表示不可变的正则表达式RegexCompilationInfo 将编译正则表达式需要提供信息注意本文属于初学正则表达式的入门文章,对于高级的分组(Group)及其涉及语法等在这里不做介绍;正则表达式基础知识 基本语法在正则表达式中拥有一套自己的语法规则,常见语法包括;字符匹配、重复匹配、字符定位

4、、转义匹配和其他高级语法(字符分组、字符替换和字符决策) ;字符匹配语法:字符语法 语法解释 语法例子d 匹配数字(09) d匹配8,不匹配12;D 匹配非数字 D匹配 c,不匹配3;w 匹配任意单字符 ww 匹配 A3,不匹配3;W 匹配非单字符 W匹配, 不匹配 c;s 匹配空白字符 dsd匹配3 d,不匹配 abc;S 匹配非空字符 SSS匹配 A#4,不匹配3 d;. 匹配任意字符 匹配 A$ 5,不匹配换行; 匹配括号中任意字符 b-d匹配 b、c、d, 不匹配 e; 匹配非括号字符 b-z匹配 a,不匹配 b-z 的字符;重复匹配语法:重复语法 语法解释 语法例子n 匹配 n 次字

5、符 d3匹配ddd, 不匹配dd 或ddddn, 匹配 n 次和 n 次以上 w2匹配 ww 和www 以上,不匹配wn,m 匹配 n 次上 m 次下 s1,3匹配s,ss,sss,不匹配ssss? 匹配0或 1次 5?匹配5或0,不匹配非5和0+ 匹配一次或多次 S+匹配一个以上S,不匹配非一个以上S* 匹配0次以上 W*匹配0 以上W,不匹配非 N*W字符定位语法:重复语法 语法解释 语法例子 定位后面模式开始位置 $ 前面模式位于字符串末端 A 前面模式开始位置 z 前面模式结束位置 Z 前面模式结束位置(换行前) b 匹配一个单词边界 B 匹配一个非单词边界 转义匹配语法:转义语法 涉

6、及字符(语法解释) 语法例子“”+实际字符 . * + ? | ( ) $ 例如:匹配字符“ ”n 匹配换行 r 匹配回车 t 匹配水平制表符 v 匹配垂直制表符 f 匹配换页 nnn 匹配一个8进制 ASCII xnn 匹配一个16进制 ASCII unnnn 匹配4个 16进制的 Uniode c+大写字母 匹配 Ctrl-大写字母 例如:cS- 匹配 Ctrl+S 构造正则表达的方法构造正则表达式需要涉及 Regex 类,在 Regex 类中包括:IsMatch()、Replace()、Split()和 Match 的类;(1) IsMatch()方法;IsMatch()方法实际上是一个

7、返回 Bool 值得方法,如果测试字符满足正则表达式返回True 否则返回 False;例;判断是非成都地区电话号码合法;分析:成都地区电话号码组成028*,前面为固定区号028,后面满足8位数字;设计正则表达式:028d8(解释:028区号固定,后面为 8个数字d 组成) ;程序代码,如图2所示:图2 “例1” IsMatch 方法是用例(2) Replace()方法;Replace()方法实际上是一种替换的方法,替换匹配正则表达式匹配模式;例2:在发布带有公开电子邮件地址的文章时,替换位 AT 避免产生垃圾邮件;分析:首先需要判断文章中电子邮箱地址,然后执行替换设计正则表达式:判断电子邮箱

8、表达式”w1,w1,.” ;程序代码:如图3所示;图3 “例2 ”Replace 方法是用例(3) Split()方法;Split()方法实际上是拆分的方法,根据匹配正则表达式进行拆分储存在字符串数组中;例3:从群发邮件地址中读取所有邮件地址;分析:群发邮件采用“;”作为分割符,需要通过“;” 进行拆分程序代码:如图4所示;图4 “例3 ”Split 方法是用例构建表达式基本方法构造 Regex 对象的构造函数包括两个重载,一个是不含参数的构造、另外一个是含有参数的构造函数; 基本形式 Regex(string pattern); 重载形式 Regex(string pattern,Regex

9、Options);补充:RegexOptions 属于枚举类型,包括 IgnoreCase(忽略大小写)、ReghtToLeft(从右向左)、None (默认) 、CultureInvariant(忽略区域) 、Multline(多行模式)和 SingleLine(单行模式) ;例4,建立一个合法 ISBN 验证格式;分析:ISBN 格式为 X-XXXXX-XXX-X;正则表达式格式:d-d5-d3-d构造该正则表达式函数 Regex ISBNRegex = new Regex(表达式,参数为空)详细代码:如图5所示;图5 “例4”构造验证函数是用例编写一个检验程序为了方便自己在学习正则表达式

10、和快速检验自己编写表达式语句是否正确,下面提供一个 IsMatch()方法正则表达式验证器编写; 打开 VS.NET,选择新建项目中的 Visual C#项目的 Windows 应用程序,取名为“Regex_Tools”;然后编写如图6所示的界面图6 正则表达式 IsMatch 方法验证器 然后在该窗体声明中增加正则表达式命名空间声明 using System.Text.RegularExpressions;编写下列代码编写一段私有的判断参数的方法,如图7所示;图7私有验证参数判断方法编写判断按钮的方法,如图8所示;图8 IsMatch 验证判断按钮方法编写清空按钮的方法,所有的文本框等于空;

11、 编译该程序,一个简单的正则表达式验证器就成功生成了;C#正则表达式整理备忘2008-03-23 13:04 by Snowtoday, 100140 visits, 收藏, 编辑有一段时间,正则表达式学习很火热很潮流,当时在 CSDN 一天就能看到好几个正则表达式的帖子,那段时间借助论坛以及 Wrox Press 出版的C#字符串和正则表达式参考手册学习了一些基础的知识,同时也为我在 CSDN 大概赚了 1000分,今天想起来,去找C#字符串和正则表达式参考手册时,已经不知所踪了。现在用到正则的时候也比较少,把以前的笔记等整理一下,以志不忘。(1) “”符号符下两 ows 表研究室的火热,当

12、晨在“ ”虽然并非 C#正则表达式的“成员”,但是它经常与 C#正则表达式出双入对。 “”表示,跟在它后面的字符串是个 “逐字字符串”,不是很好理解,举个例子,以下两个声明是等效的:string x=“D:My HuangMy Doc“;string y = “D:My HuangMy Doc“;事实上,如果按如下声明,C#将会报错,因为“” 在 C#中用于实现转义,如“n”换行:string x = “D:My HuangMy Doc“;(2)基本的语法字符。d 0-9的数字D d 的补集(以所以字符为全集,下同) ,即所有非数字的字符w 单词字符,指大小写字母、0-9的数字、下划线W w

13、的补集s 空白字符,包括换行符n、回车符r 、制表符t、垂直制表符v、换页符fS s 的补集. 除换行符n 外的任意字符 匹配内所列出的所有字符 匹配非内所列出的字符下面提供一些简单的示例:string i = “n“;string m = “3“;Regex r = new Regex(“D“);/同 Regex r = new Regex(“D“);/r.IsMatch(i)结果:true/r.IsMatch(m)结果:falsestring i = “%“;string m = “3“;Regex r = new Regex(“a-z0-9“);/匹配小写字母或数字字符/r.IsMatc

14、h(i)结果:false/r.IsMatch(m)结果:true(3)定位字符“定位字符”所代表的是一个虚的字符,它代表一个位置,你也可以直观地认为“定位字符”所代表的是某个字符与字符间的那个微小间隙。 表示其后的字符必须位于字符串的开始处$ 表示其前面的字符必须位于字符串的结束处b 匹配一个单词的边界B 匹配一个非单词的边界另外,还包括:A 前面的字符必须位于字符处的开始处, z 前面的字符必须位于字符串的结束处,Z 前面的字符必须位于字符串的结束处,或者位于换行符前下面提供一些简单的示例:string i = “Live for nothing,die for something“;Reg

15、ex r1 = new Regex(“Live for nothing,die for something$“);/r1.IsMatch(i) trueRegex r2 = new Regex(“Live for nothing,die for some$“);/r2.IsMatch(i) falseRegex r3 = new Regex(“Live for nothing,die for some“);/r3.IsMatch(i) truestring i = “Live for nothing,die for something“;/多行Regex r1 = new Regex(“Liv

16、e for nothing,die for something$“);Console.WriteLine(“r1 match count:“ + r1.Matches(i).Count);/0Regex r2 = new Regex(“Live for nothing,die for something$“, RegexOptions.Multiline);Console.WriteLine(“r2 match count:“ + r2.Matches(i).Count);/0Regex r3 = new Regex(“Live for nothing,rndie for something$

17、“);Console.WriteLine(“r3 match count:“ + r3.Matches(i).Count);/1Regex r4 = new Regex(“Live for nothing,$“);Console.WriteLine(“r4 match count:“ + r4.Matches(i).Count);/0Regex r5 = new Regex(“Live for nothing,$“, RegexOptions.Multiline);Console.WriteLine(“r5 match count:“ + r5.Matches(i).Count);/0Rege

18、x r6 = new Regex(“Live for nothing,rn$“);Console.WriteLine(“r6 match count:“ + r6.Matches(i).Count);/0Regex r7 = new Regex(“Live for nothing,rn$“, RegexOptions.Multiline);Console.WriteLine(“r7 match count:“ + r7.Matches(i).Count);/0Regex r8 = new Regex(“Live for nothing,r$“);Console.WriteLine(“r8 ma

19、tch count:“ + r8.Matches(i).Count);/0Regex r9 = new Regex(“Live for nothing,r$“, RegexOptions.Multiline);Console.WriteLine(“r9 match count:“ + r9.Matches(i).Count);/1Regex r10 = new Regex(“die for something$“);Console.WriteLine(“r10 match count:“ + r10.Matches(i).Count);/0Regex r11 = new Regex(“die

20、for something$“, RegexOptions.Multiline);Console.WriteLine(“r11 match count:“ + r11.Matches(i).Count);/1Regex r12 = new Regex(“);Console.WriteLine(“r12 match count:“ + r12.Matches(i).Count);/1Regex r13 = new Regex(“$“);Console.WriteLine(“r13 match count:“ + r13.Matches(i).Count);/1Regex r14 = new Re

21、gex(“, RegexOptions.Multiline);Console.WriteLine(“r14 match count:“ + r14.Matches(i).Count);/2Regex r15 = new Regex(“$“, RegexOptions.Multiline);Console.WriteLine(“r15 match count:“ + r15.Matches(i).Count);/2Regex r16 = new Regex(“Live for nothing,r$ndie for something$“, RegexOptions.Multiline);Cons

22、ole.WriteLine(“r16 match count:“ + r16.Matches(i).Count);/1/对于一个多行字符串,在设置了 Multiline 选项之后, 和$将出现多次匹配。string i = “Live for nothing,die for something“;string m = “Live for nothing,die for some thing“;Regex r1 = new Regex(“bthingb“);Console.WriteLine(“r1 match count:“ + r1.Matches(i).Count);/0Regex r2

23、= new Regex(“thingb“);Console.WriteLine(“r2 match count:“ + r2.Matches(i).Count);/2Regex r3 = new Regex(“bthingb“);Console.WriteLine(“r3 match count:“ + r3.Matches(m).Count);/1Regex r4 = new Regex(“bfor somethingb“);Console.WriteLine(“r4 match count:“ + r4.Matches(i).Count);/1/b 通常用于约束一个完整的单词(4)重复描述

24、字符“重复描述字符” 是体现 C#正则表达式“很好很强大” 的地方之一:n 匹配前面的字符 n 次n, 匹配前面的字符 n 次或多于 n 次n,m 匹配前面的字符 n 到 m 次? 匹配前面的字符0或1次+ 匹配前面的字符1 次或多于1 次* 匹配前面的字符0 次或式于0 次以下提供一些简单的示例:string x = “1024“;string y = “+1024“;string z = “1,024“;string a = “1“;string b=“-1024“;string c = “10000“;Regex r = new Regex(“+?1-9,?d3$“);Console.W

25、riteLine(“x match count:“ + r.Matches(x).Count);/1Console.WriteLine(“y match count:“ + r.Matches(y).Count);/1Console.WriteLine(“z match count:“ + r.Matches(z).Count);/1Console.WriteLine(“a match count:“ + r.Matches(a).Count);/0Console.WriteLine(“b match count:“ + r.Matches(b).Count);/0Console.WriteL

26、ine(“c match count:“ + r.Matches(c).Count);/0/匹配1000到 9999的整数。(5)择一匹配C#正则表达式中的 (|) 符号似乎没有一个专门的称谓,姑且称之为“择一匹配”吧。事实上,像a-z也是一种择一匹配,只不过它只能匹配单个字符,而(|)则提供了更大的范围,(ab|xy)表示匹配 ab 或匹配 xy。注意“| ”与“()”在此是一个整体。下面提供一些简单的示例:string x = “0“;string y = “0.23“;string z = “100“;string a = “100.01“;string b = “9.9“;string

27、 c = “99.9“;string d = “99.“;string e = “00.1“;Regex r = new Regex(“+?(100(.0+)*)|(1-9?0-9)(.d+)*)$“);Console.WriteLine(“x match count:“ + r.Matches(x).Count);/1Console.WriteLine(“y match count:“ + r.Matches(y).Count);/1Console.WriteLine(“z match count:“ + r.Matches(z).Count);/1Console.WriteLine(“a

28、match count:“ + r.Matches(a).Count);/0Console.WriteLine(“b match count:“ + r.Matches(b).Count);/1Console.WriteLine(“c match count:“ + r.Matches(c).Count);/1Console.WriteLine(“d match count:“ + r.Matches(d).Count);/0Console.WriteLine(“e match count:“ + r.Matches(e).Count);/0/匹配0到100的数。最外层的括号内包含两部分“(1

29、00(.0+)*)”, “(1-9?0-9)(.d+)*”,这两部分是“OR” 的关系,即正则表达式引擎会先尝试匹配100,如果失败,则尝试匹配后一个表达式(表示0,100) 范围中的数字) 。(6)特殊字符的匹配下面提供一些简单的示例:string x = “;Regex r1 = new Regex(“$“);Console.WriteLine(“r1 match count:“ + r1.Matches(x).Count);/1Regex r2 = new Regex(“$“);Console.WriteLine(“r2 match count:“ + r2.Matches(x).Cou

30、nt);/1Regex r3 = new Regex(“$“);Console.WriteLine(“r3 match count:“ + r3.Matches(x).Count);/0/匹配“ ”string x = “;Regex r1 = new Regex(“$“);Console.WriteLine(“r1 match count:“ + r1.Matches(x).Count);/1Regex r2 = new Regex(“$“);Console.WriteLine(“r2 match count:“ + r2.Matches(x).Count);/1/匹配双引号(7)组与非捕获

31、组以下提供一些简单的示例:string x = “Live for nothing,die for something“;string y = “Live for nothing,die for somebody“;Regex r = new Regex(“Live (a-z3) no(a-z5),die 1 some2$“);Console.WriteLine(“x match count:“ + r.Matches(x).Count);/1Console.WriteLine(“y match count:“ + r.Matches(y).Count);/0/正则表达式引擎会记忆“()”中匹

32、配到的内容,作为一个“组 ”,并且可以通过索引的方式进行引用。表达式中的“1”,用于反向引用表达式中出现的第一个组,即粗体标识的第一个括号内容, “2”则依此类推。string x = “Live for nothing,die for something“;Regex r = new Regex(“Live for no(a-z5),die for some1$“);if (r.IsMatch(x)Console.WriteLine(“group1 value:“ + r.Match(x).Groups1.Value);/输出:thing/获取组中的内容。注意,此处是 Groups1,因为

33、Groups0是整个匹配的字符串,即整个变量 x 的内容。string x = “Live for nothing,die for something“;Regex r = new Regex(“Live for no(?a-z5),die for some1$“);if (r.IsMatch(x)Console.WriteLine(“group1 value:“ + r.Match(x).Groups“g1“.Value);/输出:thing/可根据组名进行索引。使用以下格式为标识一个组的名称(?)。string x = “Live for nothing nothing“;Regex r

34、= new Regex(“(a-z+) 1“);if (r.IsMatch(x)x = r.Replace(x, “$1“);Console.WriteLine(“var x:“ + x);/输出:Live for nothing/删除原字符串中重复出现的“nothing ”。在表达式之外,使用 “$1”来引用第一个组,下面则是通过组名来引用:string x = “Live for nothing nothing“;Regex r = new Regex(“(?a-z+) 1“);if (r.IsMatch(x)x = r.Replace(x, “$g1“);Console.WriteLin

35、e(“var x:“ + x);/输出:Live for nothingstring x = “Live for nothing“;Regex r = new Regex(“Live for no(?:a-z5)$“);if (r.IsMatch(x)Console.WriteLine(“group1 value:“ + r.Match(x).Groups1.Value);/输出:(空)/在组前加上“?: ”表示这是个“非捕获组”,即引擎将不保存该组的内容。(8)贪婪与非贪婪正则表达式的引擎是贪婪,只要模式允许,它将匹配尽可能多的字符。通过在“重复描述字符”(*,+)后面添加“ ?”,可以将匹

36、配模式改成非贪婪。请看以下示例:string x = “Live for nothing,die for something“;Regex r1 = new Regex(“.*thing“);if (r1.IsMatch(x)Console.WriteLine(“match:“ + r1.Match(x).Value);/输出:Live for nothing,die for somethingRegex r2 = new Regex(“.*?thing“);if (r2.IsMatch(x)Console.WriteLine(“match:“ + r2.Match(x).Value);/输出

37、:Live for nothing(9)回溯与非回溯使用“(?) ”方式进行非回溯声明。由于正则表达式引擎的贪婪特性,导致它在某些情况下,将进行回溯以获得匹配,请看下面的示例:Code(10)正向预搜索、反向预搜索正向预搜索声明格式:正声明 “(?=)”,负声明 “(?!.)” ,声明本身不作为最终匹配结果的一部分,请看下面的示例:string x = “1024 used 2048 free“;Regex r1 = new Regex(“d4(?= used)“);if (r1.Matches(x).Count=1)Console.WriteLine(“r1 match:“ + r1.Mat

38、ch(x).Value);/输出:1024Regex r2 = new Regex(“d4(?! used)“);if (r2.Matches(x).Count=1)Console.WriteLine(“r2 match:“ + r2.Match(x).Value); /输出:2048/r1中的正声明表示必须保证在四位数字的后面必须紧跟着“ used”,r2中的负声明表示四位数字之后不能跟有“ used”。反向预搜索声明格式:正声明“(?=)”,负声明“ (?!)”,声明本身不作为最终匹配结果的一部分,请看下面的示例:string x = “used:1024 free:2048“;Regex

39、 r1 = new Regex(“(?=used:)d4“);if (r1.Matches(x).Count=1)Console.WriteLine(“r1 match:“ + r1.Match(x).Value);/输出:1024Regex r2 = new Regex(“(?!used:)d4“);if (r2.Matches(x).Count=1)Console.WriteLine(“r2 match:“ + r2.Match(x).Value);/输出:2048/r1中的反向正声明表示在4位数字之前必须紧跟着“ used:”,r2中的反向负声明表示在4位数字之前必须紧跟着除“used:

40、 ”之外的字符串。(11)十六进制字符范围正则表达式中,可以使用 “xXX“ 和 “uXXXX“ 表示一个字符(“X“ 表示一个十六进制数)形式字符范围:xXX 编号在 0到255 范围的字符,比如:空格可以使用 “x20“ 表示。uXXXX 任何字符可以使用 “u“ 再加上其编号的4位十六进制数表示,比如:汉字可以使用“u4e00-u9fa5”表示。(12)对 0,100的比较完备的匹配下面是一个比较综合的示例,对于匹配0,100,需要特殊考虑的地方包括*00合法,00.合法,00.00合法,001.100合法*空字符串不合法,仅小数点不合法,大于100不合法*数值是可带后缀的,如“ 1.0

41、7f”表示该值为一个 float 类型(未考虑)Regex r = new Regex(“+?0*(?:100(.0*)?|(d0,2(?=.d)|d1,2(?=($|.$)(.d*)?)$“);string x = “;while (true)x = Console.ReadLine();if (x != “exit“)if (r.IsMatch(x)Console.WriteLine(x + “ succeed!“);elseConsole.WriteLine(x + “ failed!“);elsebreak;(13)精确匹配有时候是困难的有些需求要做到精确匹配比较困难,例如:日期、Url、Email 地址等,其中一些你甚至需要研究一些专门的文档写出精确完备的表达式,对于这种情况,只能退而求其次,保证比较精确的匹配。例如对于日期,可以基于应用系统的实际情况考虑一段较短的时间,或者对于像 Email 的匹配,可以只考虑最常见的形式。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 统计图表

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报