关于正则表达式由浅到深的总结
2015-11-15 00:53
211 查看
正则表达式由浅至深的总结
最近在找实习被虐成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之间。
最近在找实习被虐成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之间。
相关文章推荐
- msql 正则表达式
- 正则表达式
- Mootools 1.2教程 正则表达式
- 批处理FINDSTR正则表达式用法实例分析
- vbs正则表达式代码
- C#使用正则表达式实现首字母转大写的方法
- php中看实例学正则表达式
- PHP正则表达式之定界符和原子介绍
- PHP下常用正则表达式整理
- 批处理 正则表达式(findstr) 整理
- C#正则表达式的6个简单例子
- JavaScript类型系统之正则表达式
- javascript中的正则表达式使用指南
- C#中的正则表达式介绍
- 学习正则帮手笨狼正则练习器
- java正则表达式应用的实例代码
- ruby 正则表达式 教程
- PHP中的正则表达式函数介绍
- javascript replace方法与正则表达式