正则表达式并没你想的那么难(二)
前言
9号的时候楼主发了一片博文讲了正则表达式的基础《正则表达式并没你想的那么难(一)》http://www.cnblogs.com/jlimy/p/3465555.html。今天给大家讲一讲正则表达式的分组。
分组
首先是分组的概念,其实分组很简单。分组的作用就是选取你想要的分组进行操作,比如替换掉东西,或者提取出来输出之类的。
1,简单的分组
(a1)(a2)(a3)(a4),你看。这里是一个最简单的正则表达式,就是匹配”a1a2a3a4“的,那什么是分组呢。正则表达式中,分组是按括号区分的,一对括号就是一个分组。
比如说上面的表达式中,a1就是第一组,a2就是第二组,a3就是第三组,a4就是第四组。嘿嘿,简单吧。
举个例子。http://www.baidu.com,这是百度的url,写一个匹配url规则的表达式为([a-zA-Z]+)://([\w\.\?]+)
先来解析一下这个表达式。
首先,我们前面说了,写正则表达式最好分部分写。那么这里面就可以分为两个部分,1.http,2.后面的具体地址。前面的头部自然就是([a-zA-Z]+)就是说大小写英文都匹配。
这部分对应的就是http,这就是第一组,因为包了个括号。而后面的([\w\.\?]+)对应www.baidu.com。也就是第二组。我相信只要你的数学达到小学三年级的标准都是能理解的。
最简单的说,就是数括号对嘛。
2,稍微复杂点的。
((a1)(a2))((a3)(a4)),这个有的朋友看着就有疑问了。这个该肿么办。
那么这个可以这样理解,首先第一对括号是什么?((a1)(a2)),这整个是第一对括号,这个没有意见吧。那么第二对括号是(a1)还是((a3)(a4))?这里有个巧妙的方法,就是数左括号。你猜到了吗?
这里的左括号是a1前面的”(“,然后再找这个括号对应的右括号,就是a1后面的那个。所以这里的第二组就是(a1)。后面的大家自己去数一数,举一反三的能力作为牛逼的程序员必须要有。
应用
这里先不讲C#中的实现。因为我看了一下内容还是有点多而且C#中的Regex类整个讲起来会偏离这篇中讲分组的主题。所以实现会放到以后讲。
分组中应用其实还蛮多的。
我讲2个我认为会用到的地方,莫怪在下才疏学浅,因为想例子真的很费劲,键盘的逗号键又不怎么灵,所以很抱歉这里只列举两个。
1,先我遇到的地方,url重写。http://www.xxxx.com/detail-45613.aspx,不知道你们是否看见过这样的url,其实他的本来面目是http://www.xxxx.com/detail.aspx?id=45613,首先写一个正则表达式匹配这个url,http://www\.xxxx\.com/detail-(\d+)+\.aspx,将这里匹配到的(\d+)提取。比如r1代表第一组的内容,重写为http://www.xxxx.com/detail.aspx?id=r1就能完成重写。
2,比如有一数组,结构为name:jilimy;age:22,sex:man;将其中jilimy,24,man提取出来分别作为r1,r2,r2即第一组第二组第三组中的内容,改写为“姓名:r1;年龄:r2;性别:r3;"就变成了 “姓名:jilimy;年龄:24;性别:man;"这是很好用的地方。
其他的不在赘述,相信大家懂了之后都能自己找到很多的应用的地方。
尾声
前面两篇先暂时讲这些理论性的东西。想自己去敲代码实现的同学可以去看看Regex类的属性和方法或者关注下我,我会在后面的博文中写到关于C#中的实现。
写这篇也花了1个小时的时间,主要这个逗号键不灵让我有点蛋蛋的忧伤。觉得对您有帮助的话或者愿意奉献爱心的园友点个推荐吧,谢啦~!