正则表达式学习心得

正则表达式学习心得

记得刚开始接触正则表达式的时候感觉这东西非常非常的难,用一堆莫名奇妙的符号来干活。而且这些莫名奇妙的符号又非常非常的不友好,让人看了就没有想学习它的冲动。可以编程学习的深入,越来越觉得正则表达式是个好东西啊,有种一定要占有它的冲动,由于种种原因让我学习正则表达式的计划一拖再拖,虽然这些原因多半是自己照成的。庆幸我对正则的学习热情并没有减退,总于上天给了额这么一个机会,终于我的正则表达式学习开启了。

在正则表达式的世界里分很对的流派,如:.net,java,perl,javascript等。这些流派对正则表达式提供的支持都稍有不同。在这些流派里我主要学习了.Net流派下的正则表达式,下面我来聊聊在.Net下正则表达式能干什么。

学习一门新的语言首先得熟悉下它的关键字,我想大家应该和我一样吧。好吧,我们来看看.Net流派里的正则表达式都用些什么关键字吧:

字符缩略表示:

\a [\b] \e \f \n \r \t \v \octal \x## \u## \cchar

符号

名称

简介

\a

[\b]

退格符号

只能在字符组中使用

\e

\f

\n

\r

\t

\v

\octal

转义用8进制表示的字符

\x##

转义2位16进制的字符

\u####

转义4位16进制的字符

\cchar

字符组及相关结构

符号

名称

简介

[]

字符组

[^]

排除型字符组

.

通配符号

代表任意字符

\w

通配符号

代表字母类型的字符

\d

通配符号

代表数字类型的字符

\s

通配符号

代表空格类型的字符

\W

通配符号

代表非字母类型的字符

\D

通配符号

代表非数字类型的字符

\S

通配符号

代表非空格类型的字符

\p{Prop}

锚点

符号

名称

简介

^

锚点

一行开头的位置

\A

锚点

字符串的开头位置

$

锚点

一行结束的位置

\z

锚点

字符串结束的位置

\Z

锚点

字符串结束的位置

\G

锚点

上次匹配成功的位置

\b

锚点

单词分界符

\B

锚点

单词分界符

(?=)

锚点

顺序循环,匹配点右边的位置

(?!)

锚点

顺序否定循环,匹配点右边的位置

(?<=)

锚点

逆序循环,匹配点左边的位置

(?<!)

锚点

逆序否定循环,匹配点左边的位置

注释及模式修饰符

符号

名称

简介

(?XX-XX)

(?XX-XX:)

(?#)

分组和捕获

符号

名称

简介

()

分组

(?<name>)

命名分组

(?:)

只分组,不捕获

(?>)

固化分组

|

逻辑或

*

量词

指前面的内容可以重复0次或多次

+

量词

指前面的内容可以重复1次或多次

?

量词

指前面的内容可以重复0次或1次

{n}

量词

指前面的内容必须重复n次

{n,}

量词

指前面的内容至少出现n次

{x,y}

量词

指前面的内容至少出现x次,最多出现y次

*?

忽略优先级量词

量词“*”的忽略优先匹配

+?

忽略优先级量词

量词“+”的忽略优先匹配

??

忽略优先级量词

量词“?”的忽略优先匹配

{n}?

忽略优先级量词

量词“{n}”的忽略优先匹配

{n,}?

忽略优先级量词

量词“{n,}”的忽略优先匹配

{x,y}?

忽略优先级量词

量词“{x,y}”的忽略优先匹配

(?if then|else)

我没说错吧,确实是一堆让我看的莫名奇妙的符号哈。没关系在接下来的介绍中我会详细的介绍上面的这些莫名奇妙的符号。

做为程序员的我总喜欢在学习一项新技能后研究它的使用方法和琢磨什么时候用它会比较好。在接下来的总结中,我就用例子来带动学习吧。

例子1 如何用正则表达式匹配中国的邮政编码

被匹配的文本:

330000

使用的正则表达式:

\d{6}

简介:这里我用\d{6}来匹配咱们的邮政编码,\d这个关键字在正则表达式的世界里代表着"数字字符",即如下字符:1,2,3,4,5,6,7,8,9,0。接在\d后面的关键字{6}代表着前面的\d符号必须出现六次。综合下,这个正则表达式要表达的意思就是:必须连续6位都为数字的字符串才能成功匹配,如字符串"343000"。

例子2 如何用正则表达式匹配出生日期

被匹配的文本:

1987-01-01或1986-05-8或1985-6-4

使用的正则表达式:

\d{4}-\d{1,2}-\d{1,2}

简介:我们期望匹配的文本中,生日的年份,月份,日期都用符号“-”来分割,这部分是确定的,所以我们在正则表达式中也写死该符号必须出现在年份,月份和日期中。但是生日的月份和日期可能用2个数字来描述“05”也可能用一个数字来描述“1”。所以这里我们使用了\d{1,2}。\d{1,2}表示,数字最少出现1个,最多出现2次。

例子3 在一串字符中匹配金钱文本

被匹配的文本:

今天我买了件T恤花了我76.88块钱。

我今天花了50.5块钱买了一顶帽子。

我午餐一共花了15块钱。

使用的正则表达式:

\d+\.\d*

简介:在3个文本中都出现了金钱文本:“76.88”,“50.5”,“15”。但他们还是有差异的:证书部分是必须出现的,小数部分的内容是可能出现的,小数部如果出现则可能为一位数字也可能为两位数字。正则表达式“\d+\.\d*”刚好能将这种情况给解决了。\d+在这里用来描述整数部分,“+”表示前面的内容至少出现一次。“\.”表示小数点,因为“.”在正则表达式中是关键字,所以我们不能直接用“.”号来表示小数点,我们必须将它转义。“\d*”用来描述小数部分,"*"表示可能出现很多次,也可能一次都不出现。综合上面的解释,我们的正则表达式要描述的意思就是:整数部分至少出现一位,小数部分可以出现一位,两位或没小数部位。

例子4 在一串文本中匹配联通的手机号码

被匹配的文本:

逍遥哥的手机号码是13510897654,逍遥妹的手机号码是13090876576。

使用的正则表达式:

(130|131|132|155|156|185|186)\d{8}

简介:应为联通的手机号码的开头三位只能是:130,131,132,155,156,185,186所以我们用“|”表示他们都可能出现,我们把130|131|132|155|156|185|186放入到“()”中,将这些内容作为一个整体独立出现。综合上面的解释,我们的正则表达式要描述的意义就是:联通的手机号码可以分两部分:开头的3为数字和后面的8位数字。如果开通的3为数字符合联通号码的命名标准则就匹配它。

例子5 匹配中国的身份证编号

被匹配的文本

36240119880105102x 或 362401196002451049

使用的正则表达式

\d{17}[0,1,2,3,4,5,6,7,8,9,X]

简介:“[0,1,2,3,4,5,6,7,8,9,X]”表示“[]”里面放的用逗号隔开的内容都可能出现。综合上面的解释,我们的正则表达式要描述的意思就是:身份证号码分两部分来进行匹配,第一部分为17位的数字,后一部分为1位数字或一个x。(这个正则表达式只是用来学习,正则用来匹配身份证还是不够成熟)

例子6 匹配Html标记

被匹配的文本

最近我看了一本关于正则表达式的书:<b>精通正则表达式<\b>,感觉超赞!

使用的正则表达式

<b>.+</b>

简介:应为匹配的是Html标记,所有必须将我们期望匹配的标记写下来如:<b></b>。这个正则表达式中的”.“号表示任何字符,那么”.+“就表示任何字符至少出现一次。综合上面的描述,我们的正则表达式的意思就是:在<b></b>中有内容的字符串,即” <b>精通正则表达式<\b> “。

例子7 匹配嵌套的Html标记

被匹配的文本

最近我看了一本关于正则表达式的书:<b><b>精通</b>正则表达式<\b>,感觉超赞!

使用的正则表达式

<b>((?!<b>).)+?</b>

简介:该正则表达式能匹配文本”<b>精通</b>“,这个正则表达式比较复杂。它包含3部分:首先它必须保证匹配文本是以符号”<br>“开头并以”</b>“结尾。然后就是”(?!<br>.)“,这部分表示匹配内容的右边部分不应该出现文本”<br>“,最后一部分”+?“,这部分表示降低前面内容在匹配时的优先级,即降低”(?!<br>.)“匹配时候的优先级。综合上面的描述,我们的正则表达式的意思就是:匹配最里面的用<b></b>标记括起来的内容。

例子8 匹配超级链接中的href属性值

被匹配的文本

<a target="_blank" href="http://www.baidu.com">百度</a>

使用的正则表达式

<a.+?href=("[^"]*"|'[^']*'|[^"']).*>.*</a>

简介:该正则表达式能够匹配超级链接标记,并能提取出href属性的内容(提取方法后面会介绍)。该正则表达式共分3部分:第一部分是”<a>.*</a>“该部分确保我们匹配成功的文本是超级链接标记。第二部分”.+“,该部分确保在匹配属性”href“时忽略一些没必要的属性。第三部分” href=("[^"]*"|'[^']*'|[^"']).* “表示我们期望提取的”href“属性的内容。href属性里面的内容可以为三种情况:”href=http://www.baidu.com“或”href="http://www.baidu.com"或“http='http://www.baidu.com'”。我们分别用“[^"']*”,“"[^"]*"”,“’[^']*'”来表示这三类情况并用“|”符号表示他们之间的出现关系。

例子9 在一串数字字符中,匹配邮政编码。

被匹配的文本

123456789012343000234567123456343001098765343002123456876543

使用的正则表达式

\G((?!34)\d\d\d\d\d\d)*?(34\d\d\d\d)

简介:这里的那串数字应该是以6的倍数出现的,按理来说它们应该都是邮政编码。我们要做的就是通过正则表达式将我们期望获取的邮政编码个筛选出来。我们希望每6位每6位的进行匹配。这里我们需要用到一个技巧,使用忽略优先级能完成我们的需要“((?!34)\d\d\d\d\d\d)*?”。它在每次匹配的时候会保存一个快照,然后直接略过6个数字进行。如果能成功匹配则继续,否则返回到这6个数字的匹配位置继续匹配。最后我们还使用了“\G”,这样可以防止在匹配到字符串尾部的时候由于没能完成匹配而进行的无用回溯。

例子10 匹配URL中的路径和访问文件的扩展名

被匹配的文本

http://www.helloworld.com/demo/helloworld/2011/09/26/index.html

使用的正则表达式

http(s)?://.+?([^/]+)(/.*\.(\w+))?

简介:首先用“http(s)?”限制访问的文件必须http协议的,然后用".+?[^/]+"来过滤url中的主机域名。最后通过“(/.*\.(\w+))”获取url中的访问路径和访问文件的扩展名。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值