1、正则表达式的用途
也许你从没接触过正则表达式,但是正则表达式却无时无刻不在应用在你周围;
例如关于文件的简单操作,如搜索和替换,前台反馈匹配的结果,而后台的运行大都为正则表达式在工作;
正则表达式的用途大致有两个:过滤和替换,其中过滤应用得更加多一些,实际上替换也是先过滤到匹配的字符或字符串再替换;如过滤日期、电话号码、特定字符串、银行卡账号等数字账号等等;或者web上注册一个账号,规定数字或除某些特殊字符;或者爬虫获取某个网页的URL等信息,用于获取数据;
正则表达式的应用非常广泛,从system到program language到tools,随处可见正则表达式的身影;掌握正则表达式可以大大提高对文本字符串的处理效率;正则表达式英文表示为regexp或者regex;
2、正则表达式语法
2.1 正则表达式中的特殊字符
- “.”。
表示匹配非换行(\n)的任意字符,如想要匹配good,food,那么regexp:.ood;当然除了字母也可以是其他字符和数字;
- “+”,“*”,“?”。
将这几个单独列在一起,表示一类,定义为匹配前面表达式或字符的次数;“+”表示1次或多次,“*”表示0次或多次,“?”表示0次或1次;有些抽象,还是举例吧:
regexp:go+d,表示可以匹配god,good,goood等;
regexp:go*d,表示可以匹配gd,god,good等;
regexp:go?d,表示可以匹配gd和god;
- “^”,“$”,“\b”,“\B”。
表示匹配的位置,“^”表示匹配字符开始的位置,有的也包括\n,\r之类的换行符;“$”表示匹配字符结束的位置,有的也包括\n,\r之类的换行符;“\b”表示匹配字符的边界位置,一般是字符与空格之间为界;“\B”与“\b”相反,表示匹配非字符的边界位置;还是举例吧:
regexp:^good,表示匹配good开头的字符串,如good morning中的good,good afternoon中的good等;
regexp:good$,表示匹配good结尾的字符串,如very good中的good,pretty good中的good等;
regexp:_\b,表示匹配以下划线右边界,如init_的下划线,那么以下划线为左边界regexp:\b_,可以匹配_init的下划线;
regexp:_\B,表示匹配非以下划线右边界,如env_init或init_的下划线;
ps:以上的只是正则表达式中的元字符中的一小部分,接下来我们会慢慢深入;
2.2 正则表达式中的小括号“()”,中括号“[]”,大括号“{}”
还是从最简单的开始说起吧:
- “{}”
表示匹配的前面表达式的个数或者范围;如{2}表示匹配前面表达式2次,{2,}表示匹配前面表达式2次以上,{2,9}表示匹配前面表达式2次到9次之间的次数;实际有点类似于数学中的范围表示一样不过是用大括号表示;
regexp:o{2},可以匹配good中的两个o,不能匹配god中的一个o;
regexp:o{1,},则可以匹配god中的1个o,good中的2个o,gooooood中的所有o;
到这里是否觉得似曾相识,元字符“+”,“*”,“?”也可以表示匹配次数,实际上这两种表达式是等价的,这里又有一个等价的概念,有很多表达式可以用不同的写法表示相同的意思或者达到相同的效果;比如此处的“+”与{1,}等价,“*”与{0,},“?”与{0,1}等价;更多的等价的表达式,后面会慢慢讨论,此处先留有这个印象;
- “[]”
表示匹配[]中的单个字符;
regexp:[bpl]oll,可以匹配boll,poll,loll;
regexp:[a-zA-Z0-9],表示可以匹配任意一个大小写的字母和数字;
与[]一起使用的元字符“^”,[^],表示匹配非[]中的单个字符;
regexp:[^abc],表示可以匹配abstract中的除了a,b,c字符以外的任意一个字符;
- “()”
表示指定表达式,也叫做分组,此时匹配到的结果可以引用,也就是使用()表达式时会分配存储空间;
在之前的regexp中都是讲的单个字符或指定字符串的匹配,如果想要更多的自由度,就可以使用小括号来实现;
regexp:([0-9]{3})+,表示可以匹配包含3个数字一次或一次以上的数字,比如,123,123456;注意1234和12345都不能匹配;
与()一起使用的元字符“|”,(like|unlike),表示匹配like或者unlike;
regexp:I (like|unlike) (him|her),表示可以匹配到I like her,I unlike him等四种字符串;
2.3正则表达式中的转义字符
- “\”
有时想要匹配的字符中包含了“+”,“.”,“(”,“)”,“?”等这些对于正则表达式有特殊意义的字符时,就必须使用转义字符来转义一下,比如\+,表示匹配字符+,\(nice\),表示匹配字符串(nice),只要出现在元字符中的包含特殊意义的字符,想要在正则表达式中匹配,就必须使用“\”转义字符;当然如果要匹配转义字符,那么可以写成\\;
ps:在[]中的特殊字符都将失去意义,也就是[.],[?]都将只会匹配字符“.”和字符“?”;
3、基于当前所了解的正则表达式的一些应用
匹配11位电话号码 :1[0-9]{10}\b
匹配以a字符开始并且至少3个以上的字符的字符串:^a[a-zA-Z]{3,}$
匹配日期:[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}
匹配域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?