您的位置:首页 > 编程语言 > C#

C#正则学习

2014-01-08 23:52 155 查看
本文只是我正则学习过程中积累的一点经验,为初学者提供参考

如无特殊说明,本文仅就C#中的正则应用进行讨论,由于本人水平有限,整理时间仓促, 有错误的地方还请大家批评指正,我会及时更正并陆续增加一些新的内容

一、推荐一篇文章+一个工具+一个正则学习方法

教程: http://www.regexlab.com/zh/regref.htm
工具:match tracer 1.2

本人水平有限,教程是写不了的,所以推荐上面的一篇正则教程,这是我认为,至少在入门级中文教程里,最好的教程。

学习正则最好的方法就是做大量的练习,在CSDN上以“正则”为关键字搜索帖子,先不要看回复,看楼主的要求,自己参考教程试着写,得到正确结果,或是自己实在做不出时,再去看回复,这样大概有个百十来个帖子,你的正则基本应用就该没问题了。

二、初学正则的几个误区

1、. 小数点可以匹配除了换行符(\n)以外的任意一个字符
如要匹配小数点本身,需要加个“\”进行转义
在匹配多行时,不要试图用[.\n]来匹配任意字符,可以使用(.|\n),但一般不这样用,一般用[\s\S],或者是用.加RegexOptions.Singleline参数来达到这一效果

2、[] 使用方括号 [ ] 包含一系列字符,能够匹配其中任意一个字符。用 [^ ] 包含一系列字符,则能够匹配其中字符之外的任意一个字符。同样的道理,虽然可以匹配其中任意一个,但是只能是一个,不是多个。

记住[]匹配的只能是一个字符,不是多个。新手最容易犯的错误就是,用[^abc]这样的表达式来匹配不包含“abc”子字符串的字符串

举例
源字符串:string yourStr = "<aaa>bbb<abc>ccc<ddd>";
结果:<aaa>、<ddd>
即取出yourStr中为<...>,但<>中不是abc的内容
错误写法:<[^abc]*>
正确写法:<(?!abc>)[^>]*>

另外就是,大部分在正则中有特殊意义、在匹配其本身时需转义的字符,在[]内是不需要转义的。必须转义的只有“\”、“[”和“]”,而“^”出现在[]开始位置,“-”前后构成范围区间时,需要转义,出现在其它位置不需要转义,如

[\^ .$^{\[(|)*+?\\-]

3、\w 任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个
一般来说,是这样的,但是在某些情况下,\w也会匹配本地字符集,比如中文系统的中文,所以在明确要求是A~Z,a~z,0~9,_ 中的一个的时候,用[A-Za-z0-9_],而不用\w

4、\转义 一些在正则中具有特殊意义的字符,如想匹配这些字符本身,需要用“\”对其进行转义。

参考
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxfund/html/f49cc9cc-db7d-4058-8b8a-422bc08b29b0.htm

在实际应用中,根据具体情况,需要转义的字符可能不止如下所列字符
.$ ^ { [ ( | ) * + ? \

另外,\s,\b,\w,\d等等这些在正则中有特殊意义的字符,用在字符串""中时,需要进行两次转义,即
string pattern = "the \\b\\w+\\b number is \\d";
或者是在前面加一个“@”,取消转义
string pattern = @"the \b\w+\b number is \d";

比较特殊的是“"”,用在不带@的字符串中时,用\"来进行转义,用在带@的字符串中时,用""来进行转义
string pattern = "<img\s+src=\"[^\"]*\"\s*>";
string pattern = @"<img\s+src=""[^""]*""\s*>";

5、| “|”是以()划分范围的,如果在“|”的左右两侧没有()来限定范围,那么它的作用范围即为“|”左右两侧整体,如

举例
(1)、  ^\d+\.\d|\d+$
(2)、  ^(\d+\.\d)|(\d+)$
(3)、  ^(\d+\.\d|\d+)$
(1)和(2)的效果是一样的,表示“|”两侧整体为“或”的关系,即^\d+\.\d或\d+$
而(3)的结果与上面两个是不同的,因为它表示\d+\.\d和\d+为“或”的关系,这个表达式相当于^\d+\.\d$|^\d+$

如:123.45

(1)和(2)匹配成功,匹配结果为123.4
(3)匹配失败,因为这个式子要求,或者为不带小数点的数字,或者小数点后最多带一位小数

多个“|”时,同样以()划分作用范围

“|”的匹配顺序为从左到右,当左侧不满足要求时,再去尝试匹配右侧表达式,如果左侧匹配成功,将不再尝试匹配右侧表达式,多个“|”时,从左向右依次尝试匹配

顺便说一下,[]本身就隐含了“或”的关系,在[]中使用“|”表示“或”的关系是不对的,这样做只是多了一个普通字符“|”,用来匹配“|”字符本身,()也是同样道理

有助于理解这一概念的帖子 http://community.csdn.net/Expert/topic/5474/5474473.xml?temp=.9890863


6、RegexOptions.Singleline | RegexOptions .Multiline

一些新手仅从字面上理解,以为这两个属性是互斥的,而事实上并非如此,它们是用来改变特定符号在正则表达式中的含义的。

RegexOptions.Singleline  指定单行模式。更改点 (.) 的含义,使它与每一个字符匹配(而不是与除 \n 之外的每个字符匹配)。
RegexOptions .Multiline 多行模式。更改 ^ 和 $ 的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: