侧身向南边

灯火阑珊尽歌舞,池阁清冷穷诗书

C#正则表达式整理备忘

有一段时间,正则表达式学习很火热很潮流,当时在CSDN一天就能看到好几个正则表达式的帖子,那段时间借助论坛以及Wrox Press出版的《C#字符串和正则表达式参考手册》学习了一些基础的知识,同时也为我在CSDN大概赚了1000分,今天想起来,去找《C#字符串和正则表达式参考手册》时,已经不知所踪了。现在用到正则的时候也比较少,把以前的笔记等整理一下,以志不忘。

(1)“@”符号
符下两ows表研究室的火热,当晨在“@”虽然并非C#正则表达式的“成员”,但是它经常与C#正则表达式出双入对。“@”表示,跟在它后面的字符串是个“逐字字符串”,不是很好理解,举个例子,以下两个声明是等效的:
string x="D:\\My Huang\\My Doc";
string y = @"D:\My Huang\My Doc";
事实上,如果按如下声明,C#将会报错,因为“\”在C#中用于实现转义,如“\n”换行:
string x = "D:\My Huang\My Doc";

(2)基本的语法字符。
\d  0-9的数字
\D  \d的补集(以所以字符为全集,下同),即所有非数字的字符
\w  单词字符,指大小写字母、0-9的数字、下划线
\W  \w的补集
\s  空白字符,包括换行符\n、回车符\r、制表符\t、垂直制表符\v、换页符\f
\S  \s的补集
.  除换行符\n外的任意字符
[…]  匹配[]内所列出的所有字符
[^…]  匹配非[]内所列出的字符
下面提供一些简单的示例:

Code

(3)定位字符
“定位字符”所代表的是一个虚的字符,它代表一个位置,你也可以直观地认为“定位字符”所代表的是某个字符与字符间的那个微小间隙。
^  表示其后的字符必须位于字符串的开始处
$  表示其前面的字符必须位于字符串的结束处
\b  匹配一个单词的边界
\B  匹配一个非单词的边界
另外,还包括:\A  前面的字符必须位于字符处的开始处,\z  前面的字符必须位于字符串的结束处,\Z  前面的字符必须位于字符串的结束处,或者位于换行符前
下面提供一些简单的示例:

Code

 (4)重复描述字符
“重复描述字符”是体现C#正则表达式“很好很强大”的地方之一:
{n}  匹配前面的字符n次
{n,}  匹配前面的字符n次或多于n次
{n,m}  匹配前面的字符n到m次
?  匹配前面的字符0或1次
+  匹配前面的字符1次或多于1次
*  匹配前面的字符0次或式于0次
以下提供一些简单的示例:

Code

 (5)择一匹配
C#正则表达式中的 (|) 符号似乎没有一个专门的称谓,姑且称之为“择一匹配”吧。事实上,像[a-z]也是一种择一匹配,只不过它只能匹配单个字符,而(|)则提供了更大的范围,(ab|xy)表示匹配ab或匹配xy。注意“|”与“()”在此是一个整体。下面提供一些简单的示例:

Code

(6)特殊字符的匹配
下面提供一些简单的示例:

Code

 (7)组与非捕获组
以下提供一些简单的示例:

Code

 (8)贪婪与非贪婪
正则表达式的引擎是贪婪,只要模式允许,它将匹配尽可能多的字符。通过在“重复描述字符”(*,+)后面添加“?”,可以将匹配模式改成非贪婪。请看以下示例:

Code

(9)回溯与非回溯
使用“(?>…)”方式进行非回溯声明。由于正则表达式引擎的贪婪特性,导致它在某些情况下,将进行回溯以获得匹配,请看下面的示例:

Code

(10)正向预搜索、反向预搜索
正向预搜索声明格式:正声明 “(?=…)”,负声明 “(?!...)” ,声明本身不作为最终匹配结果的一部分,请看下面的示例:

Code

反向预搜索声明格式:正声明“(?<=)”,负声明“(?<!)”,声明本身不作为最终匹配结果的一部分,请看下面的示例:

Code

(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.07f”表示该值为一个float类型(未考虑)

Code

(13)精确匹配有时候是困难的
有些需求要做到精确匹配比较困难,例如:日期、Url、Email地址等,其中一些你甚至需要研究一些专门的文档写出精确完备的表达式,对于这种情况,只能退而求其次,保证比较精确的匹配。例如对于日期,可以基于应用系统的实际情况考虑一段较短的时间,或者对于像Email的匹配,可以只考虑最常见的形式。

 

posted on 2008-03-23 13:04 KissKnife 阅读(24939) 评论(63)  编辑 收藏 所属分类: Others

Feedback

#1楼 2008-03-23 13:10 肥田小鱼[未注册用户]

我本来也想写下来,以后用得着,看来博主帮我写了,哈哈,谢谢了!   回复  引用    

#2楼 2008-03-23 13:17 王立斌      

写的特别不错,看来还是下了一番苦心了。   回复  引用  查看    

#3楼 2008-03-23 13:26 曲滨*銘龘鶽      

不错、不错
不过这网页模板页视乎不太适合,帖代码;换成满屏的吧;
  回复  引用  查看    

#4楼 2008-03-23 13:34 生鱼片      

这个比较实用啊   回复  引用  查看    

#5楼 2008-03-23 14:38 Q.Lee.lulu      

不错
学习了!!
  回复  引用  查看    

#6楼 2008-03-23 16:07 liy      

一直想好好学了一下正则,一直就没学   回复  引用  查看    

#7楼 2008-03-23 17:06 Yoshow      

cool...   回复  引用  查看    

#8楼 2008-03-23 20:31 HuangXB      

GOOD,学习   回复  引用  查看    

#9楼 2008-03-23 22:17 woshiyanglei[未注册用户]

受益!!   回复  引用    

#10楼 2008-03-23 23:28 早班火车      

很实用,有对比有重点,一下就分清区别来了~   回复  引用  查看    

#11楼 2008-03-24 08:06 net1234      

在ff里code点不开   回复  引用  查看    

#12楼 2008-03-24 10:03 杨正祎(阿一)      

好东西~~ 这个要收藏。   回复  引用  查看    

#13楼 2008-03-24 10:04 looping      

恩,   回复  引用  查看    

#14楼 2008-03-24 10:27 Clark Zheng      

很适合收藏的文章啊   回复  引用  查看    

#15楼 2008-03-24 12:05 regex[未注册用户]

http://www.cnblogs.com/ericwen/archive/2007/12/07/RegexMatchGroups.html

这篇文章也是不错的例子!!
  回复  引用    

#16楼 2008-03-24 12:55 谁在说谎      

谢谢啦,转载了   回复  引用  查看    

#17楼 2008-04-16 12:31 AK47      

写得真好   回复  引用  查看    

#18楼 2008-04-20 12:59 MS的明天      

收藏了,谢谢   回复  引用  查看    

#19楼 2008-05-22 09:56 Conquer[未注册用户]

不错,收藏   回复  引用    

#20楼 2008-05-29 12:00 flyingfish      

写的很好,学习需要,转载了你的文章。   回复  引用  查看    

#21楼 2008-05-29 18:13 阳光下的柚子      

收藏并转载了,感谢博主   回复  引用  查看    

#22楼 2008-06-14 22:23 im_ds[未注册用户]

写的太好了   回复  引用    

#23楼 2008-06-23 17:53 www.somaison.com[未注册用户]

太好了,讲解的真不错   回复  引用    

#24楼 2008-06-26 16:21 toumh[未注册用户]

谢谢,收藏了!   回复  引用    

#25楼 2008-06-30 12:50 AndyHuang[未注册用户]

这个东西很容易懂,但是也是最快忘记的.   回复  引用    

#26楼 2008-07-08 10:04 vic zhou[未注册用户]

看了不能白看,顶下。有点没有看懂的在查查。   回复  引用    

#27楼 2008-07-24 14:04 sand[未注册用户]

十分感谢   回复  引用    

#28楼 2008-07-29 13:33 OU[未注册用户]

老大这个正则表达式怎么写啊:
<a>aaa</a>
<a class="m">aaa</a>
<a class="m" href="www.136.com">aaa</a>
<a class="m" href="www.sina.com">aaa</a>
<a href="www.cnblogs.com">aaa</a>
也就是aaa是一定的,就是a后面的是不确定的字符串,要写一个这样匹配他们的正则表达式怎么写啊。我刚学这个。
谢谢。
  回复  引用    

#29楼 2008-08-05 16:38 wjw2586121[未注册用户]

<a(.|\s)*?>aaa</a>   回复  引用    

#30楼 2008-08-12 17:09 rose_Q      

不错! 楼主收集的很全!拜读了   回复  引用  查看    

#31楼 2008-08-13 13:53 firebug[未注册用户]

只有中文的用户名要2-4个汉字,不允许数字字母的正则表达式该怎么写啊?   回复  引用    

#32楼 2008-08-19 11:10 cloudyy      

Thank you   回复  引用  查看    

#33楼 2008-08-20 10:37 Rya[未注册用户]

(5)式这样写会好些吧
([0-9]?[0-9])(\.(\d)*)$
  回复  引用    

#34楼[楼主] 2008-08-24 08:31 KissKnife      

--引用--------------------------------------------------
Rya: (5)式这样写会好些吧
([0-9]?[0-9])(\.(\d)*)$
--------------------------------------------------------
呵呵,你的写法有误,最明显的是1)缺少字符串起始符“^”;2)你的表达式要求始终包含“.”。
  回复  引用  查看    

#35楼[楼主] 2008-08-24 08:32 KissKnife      

--引用--------------------------------------------------
firebug: 只有中文的用户名要2-4个汉字,不允许数字字母的正则表达式该怎么写啊?
--------------------------------------------------------
参见第(11)点。
  回复  引用  查看    

#36楼 2008-09-23 10:37 鹏liu[未注册用户]

楼主写的清楚,简短,表达易懂!特别的适合初学者!!
在此,
赞一次!
DING,如果能再发一些高级,深入的就更好了!
再赞一下次!!!
如果有好的东东,发给我啊,呵呵,谢谢!
  回复  引用    

#37楼 2008-10-13 19:05 雪香[未注册用户]

学习!!   回复  引用    

#38楼 2008-11-04 22:21 wlb[未注册用户]

收藏了。   回复  引用    

#39楼 2008-11-29 12:38 黑色野草      

我也收藏了,呵呵   回复  引用  查看    

#40楼 2008-12-12 17:58 wyyy[未注册用户]

Ctrl+C 啦   回复  引用    

#41楼 2008-12-14 22:28 入门级[未注册用户]

@lz,
我学习正则一直就有这样的疑惑,关于正则中那个转移字符\的用法,
(5)择一匹配中举得这个例子
Regex r = new Regex(@"^\+?((100(.0+)*)|([1-9]?[0-9])(\.\d+)*)$");
这个@ 跟后面的([1-9]?[0-9])(\.\d+)*)$"中的\.啥关系哦,还有那个* 是不是意味着99.99.99也能匹配(周末休息在外地,同学问一个问题百度到了lz的文章,没环境试验)。

  回复  引用    

#42楼 2008-12-27 17:34 张波sun      

收藏   回复  引用  查看    

#43楼 2009-01-12 12:12 正则学习er[未注册用户]

写的很好,清楚明了~~   回复  引用    

#44楼 2009-01-16 22:50 oec2003      

收藏   回复  引用  查看    

#45楼 2009-03-03 20:56 xuanyue[未注册用户]

好极了,全面而不繁琐,赞!   回复  引用    

#46楼 2009-03-06 16:11 不值一提[未注册用户]

楼主,发现你一个小错误,哈哈......
Regex r = new Regex(@"^\+?((100(.0+)*)|([1-9]?[0-9])(\.\d+)*)$");这个表达能通过"0.0.0.0.0"验证,应该改为Regex r = new Regex(@"^\+?((100(.0+)*)|([1-9]?[0-9])(\.\d+)?)$");
  回复  引用    

#47楼 2009-03-26 15:31 Colin.Wang[未注册用户]

很好的文章呢   回复  引用    

#48楼 2009-03-31 16:58 shining2222[未注册用户]

转了   回复  引用    

#49楼 2009-04-02 11:01 Gamer142857[未注册用户]

你的学习笔记帮了我不少忙,非常感谢!   回复  引用    

#50楼 2009-04-08 19:38 微微笑

收藏了,辛苦了!   回复  引用    

#51楼 2009-05-16 12:01 DotNet编程      

总结的好,收藏了.   回复  引用  查看    

#52楼 2009-05-21 16:34 靠c#吃饭的小孩      

今天运气真好,刚刚学了正则式,就看见了这么好的整理,必须转载,谢了!   回复  引用  查看    

#53楼 2009-06-17 17:30 merry[未注册用户]

aaaa<e>aaaleerel</e>;lkjfsfjsfs<e>lsdjfla</e>lskdjfaldj
要查找出所有<e>和</e>之间的字符串该怎么写?
  回复  引用    

#54楼 2009-06-24 10:49 net2.0[未注册用户]

实用,谢谢   回复  引用    

#55楼 2009-06-24 15:49 王子工作室      

最近刚准备做移动通信,第一个学习的就是 正则 上午看了一遍红皮书,感觉没有楼主的 理论+例子好 言简意赅,非常感谢,休息5分钟,再看一遍
还有 那个(9)回溯与非回溯不是很懂,能再解释一下吗?
  回复  引用  查看    

#56楼 2009-06-24 16:44 王子工作室      

第二遍的时候都懂了 再次感谢   回复  引用  查看    

#57楼 2009-06-25 14:53 aaafffffffffff[未注册用户]

写的很精辟!十分适合初学者   回复  引用    

#58楼 2009-06-25 17:03 王子工作室      

@merry
(?<=<e>).*?(?=</e>)
  回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1118423




相关文章:

相关链接:

导航

统计信息

News

与我联系

搜索

 

留言簿

随笔分类(61)

随笔档案(73)

积分与排名

最新评论

阅读排行榜