关于正则表达式由浅到深的总结

正则表达式由浅至深的总结

最近在找实习被虐成dog了,我愈发觉得我应该把面试过程遇到的一些列问题写出来跟大家共勉。我第一次面试,被面试官问了一个问题,一个一百万条的ip数组(每条数组都有一个ip区间,后边有对应的城市),怎样根据用户的ip获取到他对应的地址(不可以使用第三方接口,我当时也是第一反应就是借助第三方.)。

一开始我也蒙了,我以为他要考我算法,什么排序,二分....满脑子飞舞......最后的结果大家就....好,让我们言归正传,通过这个问题,我发现其实用正则表达式是很容易找出来的。下面是我学习正则表达式由浅到深的出来的总结,希望博得各位大牛嫣然一笑(会持续更新).....


一:单字符


(1)纯文本正则表达式可匹配纯文本,如james(虽然是一个单词,但也确实是一个正则表达式).

 (2) 如果被匹配的句子包含多个满足正则表达式的词,默认只返回第一个,但是不同的编程语言提供了各自的api,
 可以把所有满足正则表达式的词找出来。

(3)如果正则表达式是纯文本的表达式,那么匹配的结果是区分大小写的。比如:James Harden is called james.

正则表达式:james,则只能 匹配到james.同样,不同的平台有各自的api可以让匹配结果不区分大小写。

 (4).符号可以表示任意一个字符(严格来说除了换行符以外),字母,数字,也包括.符号本身(需要转义,后边有解释)。

比如:正则表达式:m.b  可以匹配到mob,mxb.....

 (5).符号可以连续出现也可以间隔出现,但它代表的意义永远表示.符号所在的位置可以对应任意的单个字符。

比如:正则表达式:m.b..可以匹配到mmbbb,mobbb,mmbnb......诸如mmbbbb或者mbnbmm就匹配不了。

 (6)如果需要匹配.符号本身的话,需要加反斜杠进行转义(当一个符号在正则表达式有特殊意义时,

加一个反斜杠就可以表示这个符号本身了)。比如\.就表示匹配.符号本身而不是表示其他的任意字符.


二:匹配一组字符


 (1)元字符[ ]表示一个区间,其中左边的ascci码值要小于右边的才正确,比如[3-1]是错误的[1-3]是正确的。

 (2)[ ]里面包含的区间字符可以用-元字符符号表示,也可以把所有在区间内的字符一一列举出来。

比如[1-3]和[123](注意不是123)是等价的。

 (3)同样的,[ ]区间里的元素是区分大小写的。比如[a-z]与[A-Z]表示的是两个不同的区间.

 (4)-(连字符)仅仅在元字符[ ]中使用才是正则表达式的特殊字符,表示的是从...到...。如果-放在[ ]外使用,

则不是特殊字符,他表示的就是-字符本身。比如:[1-9]这样使用,-是一个元字符。

但是,当这样使用时[12]-,那么-就不是元字符了,仅仅表示-字符本身。

 (5)[ ]字符区间可以有多个区间综合起来,比如[1-9a-zA-Z]就是一个合法的正则表达式。

 (6)^元字符表示对区间取非操作。比如:[^1-9]表示的是1到9之外的任意字符。

三:元字符解析


 (1)什么是元字符?元字符就是在正则表达式里边有特殊含义的字符,它的出现有特殊的意义。比如:.,^,[,]...


 (2)如何表达元字符本身?既然元字符有他自身的含义,那么需要表达元字符自身的话就需要转义。比如:.

表示匹配任意一个字符,那如果我们 需要匹配.符号本身的话,我们就需要添加反斜杠(\),\.就表示的是.符号本身。


 (3)空白字符:一般来说指的是那些可以影响文本格式的字符,比如换行符,制表符,回车符...常用的空白字符有以

下几个:/n/r/t/v/f分表表示换行符,回车符,制表符,垂直制表符,分页符。


 (4)类别元字符:就是该元字符代表的是一个字符集合,比如数字就是一个字符集合。常用的有/d/D,/w/W,/s/S(大小写

表示该元字符包含的范围刚好相反),它们的意思分别是,所有数字集合/所有非数字集合,所有字母(大小写)、数字、

下划线集合/非...,所有空白字符集合/所有非空白字符集合。


 (5)使用元字符的好处:我们看一个例子,我们把表示0-9的数字范围的正则表达式意义列举出来:【0123456789】,

【0-9】,【\d】。哪一个比较简洁?肯定是最后一个了。但其实我们在想不出来元字符是什么意思的时候,用字符区

间来表示我们想表达的字符范围也是不错的选择,而且容易理解。用哪一种方法就看个人喜好了。


四:重复匹配


(1)类似[0-9][a-z]这样的字符集合虽然匹配的字符范围很广,但是匹配的字符次数是有限的。我们之前学的.元字符是

仅匹配一个任意字符,那么当我们需要匹配多个字符的时候,应该怎么办呢?+元字符很好的解决了这个问题,.+表示的

是1个以上的任意字符。其实正则表达式中有很多可以重复匹配的元字符,下面我一一列举。


(2)+元字符:这个元字符表示的意思是,它前面的集合可以出现一次以上的次数,比如[0-9]+可以匹配,99,9,999。

为了凸显+的作用,我们再看一个例子,比如正则表达式  a[0-9]+可以匹配哪一些字符集? a9,a99,a999,a9.....都可以,

但是注意了,它不能匹配a字符,因为a后面必须出现一次以上的数字字符。


(3)*元字符:之前我们讲解了匹配一个以上字符的元字符,那么匹配0个以上字符的元字符存不存在呢?答案是肯定的。

我们来看一个例子a[0-9]*表示的0个以上的数字字符。即,a字符这个正则表达式也可以匹配成功。


(4)?元字符:比较有趣的是,我们还可以仅仅匹配0个或1个字符次数。比如a[\d]?可以匹配a,a0,a1...但是却不能匹配a00,

a09....a后面仅可以出现0或1次的数字。


(5){}元字符:我们还可以为我们想要匹配的字符集合设定一个次数区间。我们来看一些例子:[\d]{3}表示的是,必须只能重

复出现3次的数字字符集合,比如333,123....[\d]{3,}表示的是重复出现3词以上的数字字符集合,但不可以低于3次。[\d]{3,6}

表示的是重复出现的数字字符次数必须介于3到6之间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值