Spiga

C#正则表达式整理备忘

2008-03-23 13:04 by Snowtoday, 94871 visits, 收藏, 编辑

有一段时间,正则表达式学习很火热很潮流,当时在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的匹配,可以只考虑最常见的形式。

 

Add your comment

126 条回复

    评论共2页: 上一页 1 2 
  1. #22楼 im_ds[未注册用户]2008-06-14 22:23
    写的太好了
     回复 引用   
  2. #23楼 www.somaison.com[未注册用户]2008-06-23 17:53
    太好了,讲解的真不错
     回复 引用   
  3. #24楼 toumh[未注册用户]2008-06-26 16:21
    谢谢,收藏了!
     回复 引用   
  4. #25楼 AndyHuang[未注册用户]2008-06-30 12:50
    这个东西很容易懂,但是也是最快忘记的.
     回复 引用   
  5. #26楼 vic zhou[未注册用户]2008-07-08 10:04
    看了不能白看,顶下。有点没有看懂的在查查。
     回复 引用   
  6. #27楼 sand[未注册用户]2008-07-24 14:04
    十分感谢
     回复 引用   
  7. #28楼 OU[未注册用户]2008-07-29 13:33
    老大这个正则表达式怎么写啊:
    <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后面的是不确定的字符串,要写一个这样匹配他们的正则表达式怎么写啊。我刚学这个。
    谢谢。
     回复 引用   
  8. #29楼 wjw2586121[未注册用户]2008-08-05 16:38
    <a(.|\s)*?>aaa</a>
     回复 引用   
  9. #30楼 rose_Q      2008-08-12 17:09
    不错! 楼主收集的很全!拜读了
     回复 引用 查看   
  10. #31楼 firebug[未注册用户]2008-08-13 13:53
    只有中文的用户名要2-4个汉字,不允许数字字母的正则表达式该怎么写啊?
     回复 引用   
  11. #32楼 cloudyy      2008-08-19 11:10
    Thank you
     回复 引用 查看   
  12. #33楼 Rya[未注册用户]2008-08-20 10:37
    (5)式这样写会好些吧
    ([0-9]?[0-9])(\.(\d)*)$
     回复 引用   
  13. #34楼[楼主] KissKnife      2008-08-24 08:31
    --引用--------------------------------------------------
    Rya: (5)式这样写会好些吧
    ([0-9]?[0-9])(\.(\d)*)$
    --------------------------------------------------------
    呵呵,你的写法有误,最明显的是1)缺少字符串起始符“^”;2)你的表达式要求始终包含“.”。
     回复 引用 查看   
  14. #35楼[楼主] KissKnife      2008-08-24 08:32
    --引用--------------------------------------------------
    firebug: 只有中文的用户名要2-4个汉字,不允许数字字母的正则表达式该怎么写啊?
    --------------------------------------------------------
    参见第(11)点。
     回复 引用 查看   
  15. #36楼 鹏liu[未注册用户]2008-09-23 10:37
    楼主写的清楚,简短,表达易懂!特别的适合初学者!!
    在此,
    赞一次!
    DING,如果能再发一些高级,深入的就更好了!
    再赞一下次!!!
    如果有好的东东,发给我啊,呵呵,谢谢!
     回复 引用   
  16. #37楼 雪香[未注册用户]2008-10-13 19:05
    学习!!
     回复 引用   
  17. #38楼 wlb[未注册用户]2008-11-04 22:21
    收藏了。
     回复 引用   
  18. #39楼 黑色野草      2008-11-29 12:38
    我也收藏了,呵呵
     回复 引用 查看   
  19. #40楼 wyyy[未注册用户]2008-12-12 17:58
    Ctrl+C 啦
     回复 引用   
  20. #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的文章,没环境试验)。

     回复 引用   
  21. #42楼 张波sun      2008-12-27 17:34
    收藏
     回复 引用 查看   
  22. #43楼 正则学习er[未注册用户]2009-01-12 12:12
    写的很好,清楚明了~~
     回复 引用   
  23. #44楼 oec2003      2009-01-16 22:50
    收藏
     回复 引用 查看   
  24. #45楼 xuanyue[未注册用户]2009-03-03 20:56
    好极了,全面而不繁琐,赞!
     回复 引用   
  25. #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+)?)$");
     回复 引用   
  26. #47楼 Colin.Wang[未注册用户]2009-03-26 15:31
    很好的文章呢
     回复 引用   
  27. #48楼 shining2222[未注册用户]2009-03-31 16:58
    转了
     回复 引用   
  28. #49楼 Gamer142857[未注册用户]2009-04-02 11:01
    你的学习笔记帮了我不少忙,非常感谢!
     回复 引用   
  29. #50楼 微微笑2009-04-08 19:38
    收藏了,辛苦了!
     回复 引用   
  30. #51楼 DotNet编程      2009-05-16 12:01
    总结的好,收藏了.
     回复 引用 查看   
  31. #52楼 靠c#吃饭的小孩      2009-05-21 16:34
    今天运气真好,刚刚学了正则式,就看见了这么好的整理,必须转载,谢了!
     回复 引用 查看   
  32. #53楼 merry[未注册用户]2009-06-17 17:30
    aaaa<e>aaaleerel</e>;lkjfsfjsfs<e>lsdjfla</e>lskdjfaldj
    要查找出所有<e>和</e>之间的字符串该怎么写?
     回复 引用   
  33. #54楼 net2.0[未注册用户]2009-06-24 10:49
    实用,谢谢
     回复 引用   
  34. #55楼 王子工作室      2009-06-24 15:49
    最近刚准备做移动通信,第一个学习的就是 正则 上午看了一遍红皮书,感觉没有楼主的 理论+例子好 言简意赅,非常感谢,休息5分钟,再看一遍
    还有 那个(9)回溯与非回溯不是很懂,能再解释一下吗?
     回复 引用 查看   
  35. #56楼 王子工作室      2009-06-24 16:44
    第二遍的时候都懂了 再次感谢
     回复 引用 查看   
  36. #57楼 aaafffffffffff[未注册用户]2009-06-25 14:53
    写的很精辟!十分适合初学者
     回复 引用   
  37. #58楼 王子工作室      2009-06-25 17:03
    @merry
    (?<=<e>).*?(?=</e>)
     回复 引用 查看   
  38. #59楼 Erwin[CN-L2]      2009-07-09 16:46
    非常不错,收下了
     回复 引用 查看   
  39. #60楼 搏击的小船      2009-07-09 17:52
    代码怎么在FF下看不见?
     回复 引用 查看   
  40. #61楼 闲聊闲逛      2009-07-10 00:48
    学习了!
     回复 引用 查看   
  41. #62楼 搏击的小船      2009-07-13 14:07
    转了,转了,呵呵
     回复 引用 查看   
  42. #63楼 lance0784[未注册用户]2009-08-14 22:48
    很好,你强大
    很受用,XX
     回复 引用   
  43. #64楼 009IT      2009-08-21 11:08
    很好~~
     回复 引用 查看   
  44. #65楼 烈火★寒冰      2009-08-25 18:06
    请问:不以某个字符串结尾的怎么写,比如有以下文本:
    ……
    http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ……
    http://static.tianya.cn/js/global/prototype1.5.0.js
    ……
    我要找出不以dtd结尾的URL,即得出的结果是http://static.tianya.cn/js/global/prototype1.5.0.js,该怎么写呢?

    我知道所有URL的正则表达式是:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
    而以jpg结尾的正则表达式是:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?.jpg
    但是怎么试都试不出我想要的。。。

    以下的均不行:(注:提取的文件里面包含三几百URL的,比如jpg,dtd,js,css结尾等)
    string strReg = @"http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?!.jpg"; //返回0条
    string strReg = @"http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?(!.jpg)"; //返回0条
    string strReg = @"http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)??!.jpg"; //返回0条
    string strReg = @"http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?(?!.jpg)"; //返回所有URL,而不仅仅是jpg结尾的
     回复 引用 查看   
  45. #66楼 shc      2009-09-06 23:18
    写的很完备啊!很不错!
     回复 引用 查看   
  46. #67楼 陈泽富      2009-09-09 15:33
    MARK 一下 以后学习
     回复 引用 查看   
  47. #68楼 seo中国      2009-09-15 18:41
    C#正则表达式!很全!SEO中国很强大!
     回复 引用 查看   
  48. #69楼 Helen_H[未注册用户]2009-09-17 10:23
    string x = "\"";
    Regex r1 = new Regex("^\"$");
    Console.WriteLine("r1 match count:" + r1.Matches(x).Count);//1
    Regex r2 = new Regex(@"^""$");
    Console.WriteLine("r2 match count:" + r2.Matches(x).Count);//1
    //匹配双引号
    咋回事儿呢 没明白 help 战士们
     回复 引用   
  49. #70楼 我是极限[未注册用户]2009-11-22 04:10
    不错,很实用!谢谢了
     回复 引用   
  50. #71楼 bgl606[未注册用户]2009-11-25 17:11
    (5)正则^\+?((100(\.0+)*)|([1-9]?[0-9])(\.\d+)*)$
    楼主少了一个“\”
     回复 引用   
  51. #72楼 屠龙      2009-11-26 12:11
    很全了!本来想自己写一个的,现在看来完全没必要!!
     回复 引用 查看   
  52. #73楼 tiyu.cc      2009-12-12 19:34
    好文章,不顶,对不起国家,对不起党,对不起人民
     回复 引用 查看   
  53. #74楼 海底的鱼      2009-12-14 21:45
    我也顶下 感谢楼主的用心
     回复 引用 查看   
  54. #75楼 yilefeng[未注册用户]2009-12-18 08:49
    top
     回复 引用   
  55. #76楼 Ryan Boo      2009-12-22 09:54
    从来没有,认真学过正则,在这篇文章之前。
     回复 引用 查看   
  56. #77楼 风灵      2010-01-25 16:09
    不错,不错
     回复 引用 查看   
  57. #78楼 ☆冷枫☆      2010-01-28 13:18
    好东东~
     回复 引用 查看   
  58. #79楼 blackboy      2010-04-17 17:02
    感谢博主~
     回复 引用 查看   
  59. #80楼 妙妙      2010-04-27 10:06
    写的好
    http://www.yiii.net
     回复 引用 查看   
  60. #81楼 code-cat      2010-05-18 14:46
    谢博主分享了,学了一上午了
    第五个的实例改成
    ^\+?((100(\.0)?)|([1-9]?[0-9])(\.\d+)?)$
    是不是更好一些?
     回复 引用 查看   
  61. #82楼[楼主] SnowToday      2010-05-18 16:04
    引用code-cat:
    谢博主分享了,学了一上午了
    第五个的实例改成
    ^\+?((100(\.0)?)|([1-9]?[0-9])(\.\d+)?)$
    是不是更好一些?

    有理。
     回复 引用 查看   
  62. #83楼 易邮      2010-05-28 15:54
    易邮推出2.9版本邮件系统

    2010年2月
    易邮推出2.9版本邮件系统
    主要增加功能:
    1. 积累解决客户反馈问题完善产品。
    2. 新推的个性版面 “21世纪”版
    邮件状态查看: 查看邮件是否成功发送, 接收人是否查看,及进行邮件回收。
    邮件监控:监控帐号收发的邮件内容,附件内容,谨防安全机密文件泄露。
    邮件审核:邮件领导审核后发送。
    邮件发送控制:控制特定用户只能发送到特定域名或接受特定域名的邮件。
    登陆安全控制:设置特定用户登陆的网络,如只能在公司内网登陆或特定机器登陆,特定帐号可以在移动办公登陆。
    21世纪版 试用
    http://www.ymailsoft.com/app/sho ... mation_Id=I00000002
     回复 引用 查看   
  63. #84楼 索为高科      2010-06-12 18:22
    厉害,收藏了-索为高科
     回复 引用 查看   
  64. #85楼 追忆似水流年      2010-07-15 14:13
    谢谢分享
     回复 引用 查看   
  65. #86楼 markzm      2010-07-24 09:18
    学习了..留名.
     回复 引用 查看   
  66. #87楼 niesen111      2010-08-02 11:15
    好东西
     回复 引用 查看   
  67. #88楼 李光飞      2010-08-11 18:25
    谢谢分享,收藏了
     回复 引用 查看   
  68. #89楼 cysong168      2010-08-15 09:04
    收藏
     回复 引用 查看   
  69. #90楼 androidXM      2010-08-23 17:34
    好文章啊,适合初学者@
     回复 引用 查看   
  70. #91楼 rgqancy      2010-08-25 16:11
    真得很棒
     回复 引用 查看   
  71. #92楼 D.Ulong      2010-10-20 23:34
    挺不错的,收藏备用
     回复 引用 查看   
  72. #93楼 MR.Jdh      2010-11-10 13:36
    好文,顶一个
     回复 引用 查看   
  73. #94楼 Mars-天      2010-11-11 11:21
    收藏,谢谢楼主
     回复 引用 查看   
  74. #95楼 小盆友      2010-11-11 17:30
    不错~~ 就是看demo代码的时候在火狐里不能显示 换一下IE 看源码的注意哦~~谢楼主
     回复 引用 查看   
  75. #96楼 惠哥      2010-11-12 19:58
    路过,参考下。。。
     回复 引用 查看   
  76. #97楼 lichen396116416      2010-11-29 17:33
    新手路过,学习
     回复 引用 查看   
  77. #98楼 青山yoyo      2010-12-06 19:39
    学习,,,,
     回复 引用 查看   
  78. #99楼 阿宽_      2010-12-09 11:28
    整理得很好,特别是页面效果很漂亮!
     回复 引用 查看   
  79. #100楼 laiwengen      2010-12-14 12:18
    漂亮,看这个就学会了下则表达式。
    为了感谢一下,特意注册一个号来评论下
     回复 引用 查看   
  80. #101楼 小吴博客      2010-12-14 14:16
    引用Q.Lee.lulu:不错
    <br>学习了!!

     回复 引用 查看   
  81. #102楼 小吴博客      2010-12-14 14:17
    可以
     回复 引用 查看   
  82. #103楼 sun_GY      2010-12-23 21:40
    不得不顶,好,强力支持~!
     回复 引用 查看   
  83. #104楼 JkD      2010-12-24 13:28
    非常好的东西啊 ,感谢lz分享
     回复 引用 查看   
  84. #105楼 临渊捉风      2011-01-05 10:40
    好东西,志在不忘!
     回复 引用 查看   
  85. #106楼 万象森罗      2011-03-09 16:17
    好,收藏了!
     回复 引用 查看   
  86. #107楼 加菲说要减肥      2011-03-09 20:55
    挺容易理解的,学习了
     回复 引用 查看   
  87. #108楼 day_day_up      2011-03-11 09:59
    十分感谢
     回复 引用 查看   
  88. #109楼 scally      2011-04-25 08:44
    不错,真是花了心思在上面
     回复 引用 查看   
  89. #110楼 billschen      2011-05-04 17:24
    感谢了!
     回复 引用 查看   
  90. #111楼 顾晓北      2011-05-04 17:50
    先标记一下。
     回复 引用 查看   
  91. #112楼 GIS的学习      2011-05-11 09:41
    (5)择一匹配中
    Regex r = new Regex(@"^\+?((100(.0+)*)|([1-9]?[0-9])(\.\d+)*)$");
    匹配0-100的数字有误。
    1、(100(.0+)*)应该改成(100(\.0+)*)
    2、比如100.00.00.00也匹配成功啊。因为(\.0+)*表示(\.0+)出现0次或多于0次
    请问是这样吗?
     回复 引用 查看   
  92. #113楼 debugbird      2011-06-05 11:55
    不错收藏!
     回复 引用 查看   
  93. #114楼 Seventeen      2011-07-21 10:32
    不错 收藏
     回复 引用 查看   
  94. #115楼 ccz1024      2011-08-06 14:05
    谢谢! 收藏!
     回复 引用 查看   
  95. #116楼 younsolider      2011-08-08 10:32
    太强大了,谢谢分享~
     回复 引用 查看   
  96. #117楼 立地太岁      2011-08-29 14:32
    能不能加点特殊字符的 找不到啊
     回复 引用 查看   
  97. #118楼 萌芽      2011-12-01 09:17
    顶!
     回复 引用 查看   
  98. #119楼 IT飞扬      2011-12-04 12:10
    非常不错,如果再写多些那更不错了。坚顶,收藏!
     回复 引用 查看   
  99. #120楼 虚天鼎      2012-01-05 10:03
    收藏了~
     回复 引用 查看   
  100. #121楼 静候轮回      2012-02-03 09:34
    求教:
    原正则表达式:
    <tr>
    <td bgcolor="#eaeaea" style="text-align:right" width=17% nowrap="true">(?<key>.*?)</td>
    <td bgcolor="#eaeaea" width=83%>(?<value>.*?)</td></tr>

    我想把上面的正则表达式变成
    <tr><td.*>(?<key>.*?)</td><td.*>(?<value>.*?)</td></tr>
    这种样子的,应该如何写?
     回复 引用 查看   
  101. 评论共2页: 上一页 1 2