C正则表达式快速入门

上传人:无*** 文档编号:45326612 上传时间:2021-12-06 格式:DOC 页数:19 大小:456.35KB
收藏 版权申诉 举报 下载
C正则表达式快速入门_第1页
第1页 / 共19页
C正则表达式快速入门_第2页
第2页 / 共19页
C正则表达式快速入门_第3页
第3页 / 共19页
资源描述:

《C正则表达式快速入门》由会员分享,可在线阅读,更多相关《C正则表达式快速入门(19页珍藏版)》请在装配图网上搜索。

1、介绍 作者将自己在学习正则表达式中的心得和笔记作了个总结性文章,希望对初学C#正则表达式的读者有帮助。内容1 什么是正则表达式2 涉及的基本的类3 正则表达式基础知识4 构建表达式基本方法5 编写一个检验程序6 参考资料正文 对于初学者看到类似“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次字符d3匹配ddd,不匹配dd或ddddn,匹配n次和n次以上w2匹配ww和

5、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匹配一个非单词边界 转义匹配语法: 转义语法涉及字符(语法解释)语法例子“”+实际字符 . * + ? | ( ) $例如:匹配字符“”n匹配换行 r匹配回车 t匹配水平制表符 v匹配垂直制

6、表符 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()方法实际上是一个返回Bool值得方法,如果测试字符满足正则表达式返回True否则返回False;例;判断是非成都地区电话号码合法;分析:成都地区电话号码组成028*,前面为固定区号028,后面满足8位数字;设

7、计正则表达式:028d8(解释:028区号固定,后面为8个数字d组成);程序代码,如图2所示: 图2 “例1” IsMatch方法是用例(2) Replace()方法; Replace()方法实际上是一种替换的方法,替换匹配正则表达式匹配模式;例2:在发布带有公开电子邮件地址的文章时,替换位AT避免产生垃圾邮件;分析:首先需要判断文章中电子邮箱地址,然后执行替换设计正则表达式:判断电子邮箱表达式”w1,w1,.”;程序代码:如图3所示; 图3 “例2”Replace方法是用例(3) Split()方法; Split()方法实际上是拆分的方法,根据匹配正则表达式进行拆分储存在字符串数组中;例3:

8、从群发邮件地址中读取所有邮件地址;分析:群发邮件采用“;”作为分割符,需要通过“;”进行拆分程序代码:如图4所示; 图4 “例3”Split方法是用例构建表达式基本方法 构造Regex对象的构造函数包括两个重载,一个是不含参数的构造、另外一个是含有参数的构造函数; 基本形式Regex(string pattern); 重载形式Regex(string pattern,RegexOptions); 补充:RegexOptions属于枚举类型,包括IgnoreCase(忽略大小写)、ReghtToLeft(从右向左)、None(默认)、CultureInvariant(忽略区域)、Multline

9、(多行模式)和SingleLine(单行模式);例4,建立一个合法ISBN验证格式;分析:ISBN格式为X-XXXXX-XXX-X;正则表达式格式:d-d5-d3-d构造该正则表达式函数Regex ISBNRegex = new Regex(表达式,参数为空)详细代码:如图5所示; 图5 “例4”构造验证函数是用例编写一个检验程序 为了方便自己在学习正则表达式和快速检验自己编写表达式语句是否正确,下面提供一个IsMatch()方法正则表达式验证器编写;78 打开VS.NET,选择新建项目中的Visual C#项目的Windows应用程序,取名为“Regex_Tools”;然后编写如图6所示的界

10、面图6 正则表达式IsMatch方法验证器9 10 然后在该窗体声明中增加正则表达式命名空间声明using System.Text.RegularExpressions;编写下列代码编写一段私有的判断参数的方法,如图7所示;图7私有验证参数判断方法编写判断按钮的方法,如图8所示;图8 IsMatch验证判断按钮方法编写清空按钮的方法,所有的文本框等于空;11 编译该程序,一个简单的正则表达式验证器就成功生成了;C#正则表达式整理备忘2008-03-23 13:04 by Snowtoday, 100140 visits, 收藏, 编辑有一段时间,正则表达式学习很火热很潮流,当时在CSDN一天就

11、能看到好几个正则表达式的帖子,那段时间借助论坛以及Wrox Press出版的C#字符串和正则表达式参考手册学习了一些基础的知识,同时也为我在CSDN大概赚了1000分,今天想起来,去找C#字符串和正则表达式参考手册时,已经不知所踪了。现在用到正则的时候也比较少,把以前的笔记等整理一下,以志不忘。(1)“”符号符下两ows表研究室的火热,当晨在“”虽然并非C#正则表达式的“成员”,但是它经常与C#正则表达式出双入对。“”表示,跟在它后面的字符串是个“逐字字符串”,不是很好理解,举个例子,以下两个声明是等效的:string x=D:My HuangMy Doc;string y = D:My Hu

12、angMy Doc;事实上,如果按如下声明,C#将会报错,因为“”在C#中用于实现转义,如“n”换行:string x = D:My HuangMy Doc;(2)基本的语法字符。d 0-9的数字D d的补集(以所以字符为全集,下同),即所有非数字的字符w 单词字符,指大小写字母、0-9的数字、下划线W w的补集s 空白字符,包括换行符n、回车符r、制表符t、垂直制表符v、换页符fS s的补集. 除换行符n外的任意字符 匹配内所列出的所有字符 匹配非内所列出的字符下面提供一些简单的示例:string i = n;string m = 3;Regex r = new Regex(D);/同Reg

13、ex r = new Regex(D);/r.IsMatch(i)结果:true/r.IsMatch(m)结果:falsestring i = %;string m = 3;Regex r = new Regex(a-z0-9);/匹配小写字母或数字字符/r.IsMatch(i)结果:false/r.IsMatch(m)结果:true(3)定位字符“定位字符”所代表的是一个虚的字符,它代表一个位置,你也可以直观地认为“定位字符”所代表的是某个字符与字符间的那个微小间隙。 表示其后的字符必须位于字符串的开始处$ 表示其前面的字符必须位于字符串的结束处b 匹配一个单词的边界B 匹配一个非单词的边界

14、另外,还包括:A 前面的字符必须位于字符处的开始处,z 前面的字符必须位于字符串的结束处,Z 前面的字符必须位于字符串的结束处,或者位于换行符前下面提供一些简单的示例:string i = Live for nothing,die for something;Regex 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

15、(Live for nothing,die for some);/r3.IsMatch(i) truestring i = Live for nothing,die for something;/多行Regex r1 = new Regex(Live 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);C

16、onsole.WriteLine(r2 match count: + r2.Matches(i).Count);/0Regex r3 = new Regex(Live for nothing,rndie for something$);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(Li

17、ve for nothing,$, RegexOptions.Multiline);Console.WriteLine(r5 match count: + r5.Matches(i).Count);/0Regex 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 cou

18、nt: + r7.Matches(i).Count);/0Regex r8 = new Regex(Live for nothing,r$);Console.WriteLine(r8 match 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$);Con

19、sole.WriteLine(r10 match count: + r10.Matches(i).Count);/0Regex r11 = new Regex(die 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($);Conso

20、le.WriteLine(r13 match count: + r13.Matches(i).Count);/1Regex r14 = new Regex(, 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(Liv

21、e for nothing,r$ndie for something$, RegexOptions.Multiline);Console.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.WriteLin

22、e(r1 match count: + r1.Matches(i).Count);/0Regex r2 = 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.Mat

23、ches(i).Count);/1/b通常用于约束一个完整的单词 (4)重复描述字符“重复描述字符”是体现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$);

24、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 match count: + r.Matches(a).Count);/0Console.WriteLine(b match count: + r.Matches(b).Count);/0Console.WriteLi

25、ne(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 c = 99.9;string

26、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 match count: + r.Matches(a).Coun

27、t);/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的数。最外层的括号内包含两部分“(100(.0+)*)”,“(1-9?0-9)(.d+)*”,这两部分是“OR”的关系

28、,即正则表达式引擎会先尝试匹配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).Count);/1Regex r3 = new Regex($);Console.WriteLine(r3 mat

29、ch 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)组与非捕获组以下提供一些简单的示例:string x = Live for nothing,die for something;string y

30、 = 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/正则表达式引擎会记忆“()”中匹配到的内容,作为一个“组”,并且可以通过索引的方式进行引用。表达式中的“1”,用于反向引用表达式中出现的第一个组,即粗体标识的第一个括号内容,“2”则依此

31、类推。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,因为Groups0是整个匹配的字符串,即整个变量x的内容。string x = Live for nothing,die for something;Regex r = new

32、 Regex(Live for no(?a-z5),die for some1$);if (r.IsMatch(x) Console.WriteLine(group1 value: + r.Match(x).Groupsg1.Value);/输出:thing/可根据组名进行索引。使用以下格式为标识一个组的名称(?)。string x = Live for nothing nothing;Regex r = new Regex(a-z+) 1);if (r.IsMatch(x) x = r.Replace(x, $1); Console.WriteLine(var x: + x);/输出:Liv

33、e 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.WriteLine(var x: + x);/输出:Live for nothingstring x = Live for nothing;Regex r = new Regex(Live for no(?:a-z5)$);if (r

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

35、.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);/输出:Live for nothing(9)回溯与非回溯使用“(?)”方式进行非回溯声明。由于正则表达式引擎的贪婪特性,导致它在某些情况下,将进行回溯以获得匹配,请看下面的示例:Code(10)正向预搜索、反向预搜索正向预搜索声明格式:正声明 “(?=)

36、”,负声明 “(?!.)” ,声明本身不作为最终匹配结果的一部分,请看下面的示例:string x = 1024 used 2048 free;Regex r1 = new Regex(d4(?= used);if (r1.Matches(x).Count=1) Console.WriteLine(r1 match: + r1.Match(x).Value);/输出:1024Regex r2 = new Regex(d4(?! used);if (r2.Matches(x).Count=1) Console.WriteLine(r2 match: + r2.Match(x).Value); /

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

38、:)d4);if (r2.Matches(x).Count=1) Console.WriteLine(r2 match: + r2.Match(x).Value);/输出:2048/r1中的反向正声明表示在4位数字之前必须紧跟着“used:”,r2中的反向负声明表示在4位数字之前必须紧跟着除“used:”之外的字符串。(11)十六进制字符范围正则表达式中,可以使用 xXX 和 uXXXX 表示一个字符(X 表示一个十六进制数)形式字符范围:xXX 编号在 0到255 范围的字符,比如:空格可以使用 x20 表示。uXXXX 任何字符可以使用 u 再加上其编号的4位十六进制数表示,比如:汉字可以

39、使用“u4e00-u9fa5”表示。(12)对0,100的比较完备的匹配下面是一个比较综合的示例,对于匹配0,100,需要特殊考虑的地方包括*00合法,00.合法,00.00合法,001.100合法*空字符串不合法,仅小数点不合法,大于100不合法*数值是可带后缀的,如“1.07f”表示该值为一个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!); else Console.WriteLine(x + failed!); else break; (13)精确匹配有时候是困难的有些需求要做到精确匹配比较困难,例如:日期、Url、Email地址等,其中一些你甚至需要研究一些专门的文档写出精确完备的表达式,对于这种情况,只能退而求其次,保证比较精确的匹配。例如对于日期,可以基于应用系统的实际情况考虑一段较短的时间,或者对于像Email的匹配,可以只考虑最常见的形式。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!