正则表达式基础(更新中。。。)

问题1:我是怎么接触到并开始学习正则表达式?

答:

   最初看到正则表达式这个词是在接触学习UltraEdit、Notepad++、UEditor等支持正则式搜索的编辑器时,当时还莫名其妙。

   真正开始学习是在自己想下载某个网站的所有图片时,在文章的末尾我会写出实现的方法。
   后来接触了Perl,才开始认识到正则式的强大。还是那句话写得好:“只要你接触了正则式,那么你的Perl程序中少不了它的身影,因为它太好用了。”

开始学习时的热身:

1.正则式和通配符(如*和?)的区别。

答:

   两者基本没有联系,只是同时使用了*和?这两个符号而已,千万不要把它们联想在一起,更不要试图把它们拧在一起理解,不然很有可能你就精神错乱了。

   通配符的'*'表示匹配多个任何字符,我们常用它来匹配*.txt,*.doc等符合某种格式的文档,而'?'与‘*’的不同在于,*匹配多个,而?只匹配一个字符。当然这两者还有很多妙用,这里就不细说了。

    

前面我们知道了*和?在通配符中的用途,而在正则式中它们的意义则完全不同。


真正意义上的开始:


    过多的细节我就不说了,这里我基本把它作为一个正则式各种繁杂元字符的汇总备忘。

    要理解正则式,其实我本人认为只要理解一点就算入门了,就是:

“正则式就是用来匹配符合某种格式的字符串的,而正则式的各种元字符就代表了各种匹配条件,比如:\d 就是在说‘这里是一个数字’,\d* 就是在说‘这里是任意数目的数字,可能是任意多个,也可能是一个都没有’”,

不知道我这样的理解是不是属于狭隘,反正我自己是这么理解的,也不管砖家是怎么说了。



我会按我自己的理解重组各种元字符,而不是像其他介绍中的那么介绍,那样的话,我觉得有点别扭。


各种元字符:


    单个匹配:

        \d  匹配一个数字
        \w  匹配一个单词,计算机所能理解的单词是指:字母或数字或下划线或汉字等
        \s  匹配一个空白,包括空格,制表符,换页符等
        .   匹配一个除了换行符之后的任意一个字符


    指定特定的位置:

        ^   代表开头,          如:^a    匹配以a开头的字符串
        $   代表结尾,           如:a$    匹配以a结尾的字符串

        \b  单词的开头与结尾     如:\babc\b    匹配abc,这样就不会匹配到abcd了  

它可以匹配围绕在单词周围的标点符号)  


    指定范围:

        [.?!]   匹配?.! 中的其中一个
        [a-z]   所有的小写字母里
        [f-k]   字母‘f’到‘k’之间的字符
        [a-zA-Z0-9] 所有的大小写字母和数字
        [^abc]  不匹配abc中的一个


    各种量词,用来控制次数:

  1.  a.从少到多排序:

            ?  匹配0次或者1次,相当于{0,1}   

助记: ?   疑问,有?还是 没有? 这样我们就记住了,可能有,也可能没有嘛。

            +   匹配多于1次,即一定到匹配一次前面的字符。   

助记:+ 加代表一定要有,即至少也要匹配一次

            *   匹配任意多个或者不匹配。

助记:* 在数学中代表任意,可以是零,也可以是无限

            
        b.指定一个重复的范围:
            {n}   重复n次
            {m,n}    重复次数为 m到n 之间的数字,含m与n

  

    分支条件:

        |   意思:或      例子:(Tom|Jack)  匹配Tom或者Jack中的一个


    转义字符(取消特殊含义,或者赋予):
        \t  \n  \r  (分别的含义:制表符,换行符,回车)

        \\  \^  \. \* 

解释:(\ ^ . 都是在正则式中有特殊含义的,加入 \ 后可以取消它原本的意义,只是作为一个普通的文本字符)


    分组:

        ()  用小括号包含表达式叫分组,所以单独使用(时,需要转义,写成:\(。括号中的内容会记录在反向引用\1 \2 等中


   修饰符:

        i   匹配时不区分大小写
        g   全局匹配

        s   忽略空白


   匹配某一个位置:


    几个规律:

        1. 一般在正则式中,大写字母是作为反义存在的,如:\s代表匹配一个空白,而\S代表着非空

        \D  匹配任意非数字的字符

2. 贪婪模式,和非贪婪模式(勉强模式)



说了这么多,还是上几个实例,大家对照前面的知识点来理解哈。

    \bhi\b.*\bLucy\b        .*表示匹配任意数量的不包含换行的字符,\bhi\b \bLucy\b 意思是单单匹配hi和Lucy,而不匹配类似high或者Lucyman之类的。这条语句会匹配类似,hi,nice to meet you,Lucy.

    0\d{2}-\d{8}        会匹配符合中国的电话号码格式的数字,如100-35838475

    \(?0\d{2}[)-]?\d{8})    匹配多个格式的电话号码,像(010)88886666,或022-22334455,或02912345678,这里的()需要转义

    ^\d{5,12}$              匹配QQ的格式,5到12个数字,比如我的QQ:871892708
    ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)   匹配IP地址的正则表达式

还有几个高级技巧,以后再补充。如果应付不太繁重的正则式工作,上面的就够用了。


正则式的基本规则就是以上了,重点是自己会不会灵活运用。我们要根据我们所有匹配的字符串的特点来写相应的正则表达式。


幕后:

推荐书籍:《精通正则表达式》
最初引我入门的文章:"正则表达式30分钟入门教程"

参考文档:揭开正则表达式的神秘面纱


最近我的一个小运用(提取某网站中的所有GIF图片):


a.某网站,http://7chan.org/gif/,上面有很多很“动感”的GIF图片,我想一次性全部都下载下来然后慢慢筛选,要是一次次右键另存为···,那我估计我迟早得疯掉。


b,基本思路:把所有我想要下载的GIF的链接提取到一个桌面的txt文档中,然后用迅雷批量下载,当然也可以调用wget命令。


c,代码实现:这里我用的是Perl语言,尤其擅长处理正则式。


附代码,勿笑我水平低哈:

#! /usr/bin/perl

open FILE, '> C:\Users\ite\Desktop\resources.txt'; #不能用“”,因为\U \i 会被转制
use 5.010;
use utf8;
use LWP::Simple;
$url = "http://7chan.org/gif/";
$content = get $url;
while ($content =~ s#(https://7chan.org/gif/src/.*?gif)# #){
    say FILE $1;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值