正则表达式基础小总结(实例讲解)

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

给定一个正则表达式和另一个字符串,我们可以达到如下的目的:

1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);

2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。

正则表达式的特点是:

1. 灵活性、逻辑性和功能性非常的强;

2. 可以迅速地用极简单的方式达到字符串的复杂控制。

3. 对于刚接触的人来说,比较晦涩难懂。

     记得我刚刚接触正则表达式的时候,看到百科举得例子,一下子就吓呆了,这是什么鬼?给人感觉就是很高深,直到我开始学正则表达式的时候,我才明白,原来正则表达式也不是想象中的那样难,反而正则表达式对于开发和运维人员来说是很基础的知识。

     我接触正则有三个阶段把,最一开始是蒙逼期,当时我编程水平还不是很高,而且我用的Java去练习正则的(一脸懵逼,怎么不用工具…),Java各种需要转义,遇到一个比较复杂的匹配式子,弄的我一直匹配不出来结果…感觉我蒙逼了很长时间,写正则总是不能顺心所欲不逾矩,每次都要调试好长时间才能匹配出正确结果。后来我用了PHP…(世界上最好的语言)PHP需要转义的地方比较少,本来我搞开发很长时间了,Java语言下的匹配基本熟悉了,换成PHP基本上我都可以匹配出来了,写很多复杂的匹配式也不怎么出错了,当时就感觉正则也就这样子吧…(很简单啊),再到后来我忘了当时我匹配什么了,一直匹配不到正确结果,我才意识到正则学问很大的,还要继续去学习正则表达式的用法。。。

     现在看来正则表达式入门不是那么难把(虽然当时我蒙逼了很长时间)举个比百科上面的简洁一点的例子,比如我有一串字符串:’我是soon,我成年了。’ 我们怎么把他的关键字提取出来呐?可以用下面的正则表达式:’/我是([\w\W]*),我([\w\W]*)了。/’ 然后得到一共数组M,M[1]就是soon。M[2]就是成年。M[0]是整个匹配到的字符串。如果没有特殊说明我这里用的都是php下的正则表达式语法。

     基础的正则表达式概念我就不说了,网上大把多,我来根据具体例子讲解一下吧。

1        "^-?\d+$"  匹配所有整数的

^后面接- 表示所匹配的字符必须以– 开头,又因为 - 后面接 ? 表示前面的字符即– 至多为一个,\d表示匹配所有的数字,+ 表示前面的字符\d 至少为一个,$表示必须以前面的字符即 \d 结尾

扩展:当然这个不是很准确的,比如0000这种就匹配出来了,解决这种情况可以把\d分成多项进行匹配

2        [\u4e00-\u9fa5]  匹配中文字符

通过:unicode编码判断是不是中文字符

3        [^\x00-\xff]  匹配双字节字符

4        http://tz.its.csu.edu.cn/Home/Release_TZTG_zd/7C97659E2C724ADCAD6DDBCFB3A3074C  抓取该网页的正文部分 可用下面这个正则表达式

<tr style="height:650px;"valign="top">([\w\W]*?)<tr style="height:40px;">

示例代码:

<?php

   $ch = curl_init();

curl_setopt($ch,CURLOPT_URL,'http://tz.its.csu.edu.cn/Home/Release_TZTG_zd/7C97659E2C724ADCAD6DDBCFB3A3074C');

             curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);

             $data= curl_exec($ch);

   curl_close($ch);

             $p= '/<tr style="height:650px;"valign="top">([\w\W]*?)<trstyle="height:40px;">/';

             preg_match_all($p,$data,$m);

             $result=$m[1][0];

        echo $result;

分析一下网页源码,匹配正文开头和结尾然后把中间部分输出 $M[1][0],这里用到一个([\w\W]*?)  ?号在[\w\W]*的后面表示的是[\w\W]*这个匹配为非贪婪匹配,也就是说尽可能匹配最少的数据

5        ((?<=<(li)>)[\w\W]*?(?=(</\1>)))  再看一个比较难的正则表达式,这个式子号称是万能正则表达式,他的用途很广泛,也不一定局限在举的这个例子,这个例子是处理DOM结构的文件匹配出所有li节点的内容的。下面我就来解释一下:

这里用到正反向预查的知识,?<=和?=表示零宽断言(属于非捕获匹配),他们不占用字符,不体现到最终的匹配结果中,?<= 表示后面式子([\w\W]*?)的前面必须紧接着<li> 同理?= 表示([\w\W]*?)的后面必须紧接着 </\1> 。\1是捕获组表示前面第一个子括号匹配的内容即 li 。因为零宽度断言的结果不体现在匹配结果中,所以这个式子匹配到的就是<li></li>中间的内容。这个式子扩展性很大,可以自己去体会咯~

6        上面的例子说到了正反向预查的知识,这个例子就讲一下正反向预查吧,这个是正则表达式里面相对复杂的部分。

假如我们想要匹配一个目标数据,这个字符串数据里面不包含“中南大学”但是包含”升华网“或者“54sh” 这样怎么搞?咋一看有点懵逼了,其实这个就要用到正反向预查的知识了。给出正则表达式:^(?!.*?(中南大学))((?=.*?升华网)|(?=.*?54sh)).+

这个式子就有点麻烦了,先分为两部分来看,第一个括号(?!.*?(中南大学))表示要匹配的数据里面没有”中南大学”;第二个括号表示要匹配的数据里面包含”升华网”或者”54sh”。因为是零宽度断言,所有数据可以反复匹配,所以我们写了三个匹配式子,每个都是匹配全部数据。?!这种其实在正则中叫做前瞻,具体介绍可以

google一下,他表示要匹配的数据中不包含”中南大学”同理 ?=表示要匹配的式子中必须包含”升华网”

下面给个图:


7        在匹配一些可嵌套的层次性结构时。如果按一般的匹配方式可能会匹配一堆堆的数据出来,为了不被搞懵,我们可以使用分组。

简单一个例子   “54sh” 匹配这个字符串 正则表达式:(?'text'54)这样匹配到的54就被压入名字叫做text的栈中了,到时候我们可以使用text名字取访问这个栈而不是0123了。当然因为他是一个栈,所以表达式如果写成(?'text'54) (?'text'sh)这样text中的栈顶元素就是sh,如果要把54输出,退掉栈顶元素即可。

下面给一个图:

 

PS:在实践中学习正则表达式是最有效率的~

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值