正则表达式小述

正则表达式这词看上去高大上,逼格满满的,但有句俗话叫“滥用正则表达式是PERL程序员令人反感的重要原因”,这么看来逼格高有时候也不一定是一件好事,开个玩笑,这句话其实有两层含义,第一层说明PERL对正则表达式的支持是非常完美的,内建了一个正则表达式引擎,另一层意思就是PERL中容易使用,使得处理问题立马想起来正则表达式,结果有些没必要用导致一些性能问题或者是造成可读性不太好,当然仁者见仁,智者见智

说了这么多废话,正则表达式是啥呢,说官方一点就是用来描述,匹配符合所写语法规则的字符串,更通俗一点就是为你感兴趣的字符串来写一个模式,匹配上你想要的东西

看了下面几个例子,任何人应该都明白了自己天天都在用正则表达式:

rm –rf *.c

cp –r *.conf /usr/local/etc

chmod –R 777 *

从这些可以看出意思就是通过一些规则,符号来匹配或者说代表符合规则的字符串,从*.c可以看出来是匹配目录下所有以.c结尾的文件名,匹配的就是具有这种规则的文件名,然后全部删除,另两条命令类似理解

熟练运行正则表达式我觉得至少要熟知几点:

1:规则符号的含义

规则,符号是用来匹配特定字符串的,不熟练掌握是没法写出来的,\^$*+?()\d\w等等分别代表的是什么,用来匹配什么

2:转义

这应该是个小问题,通过\将本身在正则表达式当中具备某种特殊功能的字符恢复成普通的字符串来进行匹配,比如要匹配‘\n’,就必须 /\\n/ 才行,不进行转义匹配的就变成换行符,而不是普通的字符串‘\n’

3:取出匹配

这个地方不知道应该如何定义这个动作,因为每种脚本语言的叫法不一样,意思就是通过()能将你所需要的东西给取出来,不管是python里的group()还是perl里的$1,$2,也就是正则表达式匹配过程中,如果有你想返回或者截取出来的字符串,通过一个括号括起来就能做到,比如:

while(<>){

    print “$1\n”if /(\w+) and lihui are friends/;

}

这样任何文件中写到的,任何跟lihui是好朋友的名字都通过模式(\w+)匹配上,并且括号里的内容也就是姓名都通过$1给打印出来了,前提是名字全部都是小写字母

4:贪婪,非贪婪

正则表达式默认会贪婪匹配,顾名思义,就是很贪心,更土点就是一直匹配到底,主要针对于+,*,只要能匹配上,就会一直进行下去,也就是会匹配到最后满足这个pattern的地方,比如:

/(lihui+)/ 匹配字符串‘lihuiiiiii’,会将5个多余的i也给截取出来,假如只需要只需要截取lihui,也就是最后面部分的第一个i截至,那么可以通过非贪婪模式,符号?来实现

/(lihui+?)/匹配出来的就是字符串‘lihui’

 

正则表达式从规则,匹配原理,以及性能可以作为一门单独的学科来学习,上面仅仅随手举了一些简单的例子来说明几点重要的,我觉得最关键的是模式匹配的pattern的写法,假如碰到比较复杂的字符串,或者一个pattern必须包含那几样甚至哪些字符串,并且不能够写得又丑又长,处理起来速度还慢,那么真的就成了开头提到的被人反感的对象了

发表回复