正则表达式学习(基础篇)(原创)
正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
我身边的一些朋友在我学习正则表达式之前告诉我说这门语言有些反人类,但是在我学完之后,我发现其实正则表达式并没有那么难,不过是谣传罢了。
正则表达式 的“鼻祖”或许可一直追溯到科学家对人类神经系统工作原理的早期研究。美国新泽西州的Warren McCulloch和出生在美国底特律的Walter Pitts这两位神经生理方面的科学家,研究出了一种用数学方式来描述神经网络的新方法,他们创造性地将神经系统中的神经元描述成了小而简单的自动控制元,从而作出了一项伟大的工作革新。
这也说明了正则表达式是符合人脑的,并非是非人类的,反而应该更加简单于复杂的编程/脚本语言。
正则表达式作用
比如你写了一篇文章,文章中会出现HJL1001,HJL1002…,突然你发现你写错了,应该全部替换为HJL0999,一般我们替换是替换相同的字符串,可是这个无法直接替换,那么怎么办,我们就可以实用正则表达式的知识了,下面给出实例,当你在学完本系列教程后,就可以理解了:
(?<=HJL)\w{4}
前期准备工作
下载一个RegexBuddy进行正则表达式学习,或者上网找一个在线正则表达式测试网站,确保可以使用。
对于基础正则表达式的格式
^表示一段文本开始位置,$标识一段文字结束的位置,基础正则表达式的开始结尾规范来说需要写为
^......$
正则表达式基础语法1
元字符 | 描述 |
---|---|
[…] | 表示在什么范围内匹配的内容 |
{…} | 一半前接[],规定本次查找[]内内容出现次数 |
- | 标识一个范围,多用在[]中,距离a-z,0-9 |
^ | 若放于[]中则表示否的意思,详细下面会讲 |
案例1
小明碰上了一个熊孩子,把他用电脑写的一篇语文作文里面随机输入了一个英文字符(a-z,A-Z),已知小明并没有在文章中写英文字符,如何快速替换掉英文字符,这时如果直接找的话非常不符合小明一贯的作风,所以就需要用到正则表达式。
^[a-zA-Z]$
正如前文所说^标识文本开始,$标识文本结束,那么如果这个英文字符不在开头或结尾的话,就不能加上^或$,所以正确的正则表达式应为:
[a-zA-Z]
这里面-标识一个范围,范围是a-z或者A-Z,这里面-只会连接左右一个字符,所以不要对a-z和A-Z空格,因为[]会检查每一个在它里面的字符,包括空格符。
案例2
同上, 那个熊孩子看见小明会了正则表达式基础,不死心,回来增加了随机添加英文字符长度为3的字符串,每次添加例如aAa,bbb,Cab,dca…不过小明很机智的继续使用了正则表达式的知识
[a-zA-Z]{3}
这句话的的前半部分和之前一样,但是后面的{3}意味着要用[]中的条件匹配三次,三次匹配全部通过才算被选中,所以如果说熊孩子不小心输入了abCd,那么我们就无法匹配了,这怎么办呢,这时我们就要使用{}的其他形式了。
[a-zA-Z]{1,}
这是{}的其他使用方法,表示[]中的条件出现次数必须大于或等于1次,不然匹配不成功(熊孩子大家都知道,很可能会少输入一个字符或者多输入一个字字符的)。如果{}中逗号右边的数字不写默认为不限定大小,但是左边的数字不可以不写。对于{1,},正则表达式提供了一个更为简洁的表达方式+所以上一段表达式等价于
[a-zA-Z]+
案例三
小明在写代码的时候,突然发现自己的变量名命名很不规范(如果没有学过编程就把变量名当作一个人名即可),他的变量名命名长度是1-3个英文字符,他想把这些变量名全部替换为i,那么他如何才能选中这些变量名的(忽略1-3个英文的关键字和函数名问题),解决方案如下:
[a-zA-Z]{1,3}
这个表达的意思是[]中字符匹配次数必须在1-3次,不然无法被选中。
案例4
熊孩子这次给小明的英语作文里随机插入了英文,那么小明怎么才能用正则表达式选中全部的中文呢(忽略标点情况)。
[^a-zA-Z]
这句表达式的意思是不为a-z或A-Z的会被选中(请将^写在[]中开始位置)
正则表达式基础语法2
元字符 | 描述 |
---|---|
() | 不同于[],()可以将其中的字符匹配条件组合以匹配一个字符串并获取这一匹配 |
. | 标识任何一个字符,如果想使用’.’字符,请输入\. |
案例1
匹配一组编号,编号格式为 HML数字8位,如何检查这个编码格式对不对,解决方案如下:
(HML)[0-9]{8}
注意[]中的0-9,请按照字符看待,这句正则表达式意味着首先匹配字符串HML,然后匹配0-9中的字符,匹配8次成功后才能被选中,()元字符也可以被{}修饰。
案例2
匹配一组编号,编码格式为H_L数字8位,_处可以为任何大写英文字母,正则表达式匹配方案如下:
(H.L)[0-9]{8}
.标识任何字符,后面也可以被{}修饰,如果想表达字符的.,请使用\.来表示,()中也可以包含[]或.等等。
正则表达式基础语法实例
实例1
如何判断一个用户输入的日期是否符合预定的日期格式YYYY(/.-)MM(/.-)DD,可使用正则表达式进行处理,解决方案如下:
首先先写YYYY的格式判断,应为YYYY应为一段文本开始,所以开头需要加上位置标识符^,年的范围为1000-9999。将YYYY分2部分,第一部分是第一位,范围应是1-9,第二部分应是0-9,出现3次,然后使用()将()中的条件组合进行字符串匹配。
^([1-9]{1}[0-9]{3})
然后写MM的格式判断,因为MM在这段文字的中间,所以不需要开头或者结尾加上^或$,一年一个12个月,因为[]中匹配字符,所以不能直接写成1-12,在()中|为或者之意。
([1-9]|1[1-2])
一年中一个月最少天数是28天(2月),最多天数是31天,我们忽略年份对于闰月的判断和对月份天数的判断,单纯判断天数是否在1-31之间,而因为DD应为本字符串结尾,所以结尾需要加上$。月份分为两个情况,当第一位是0-2时,第二位可以为0-9。当第一位是3是,第二位可以是0-1。
([0-2][0-9]|3[0-1])$
分隔符可以为/ . -。
[.\-]
组合在一起就是
^([1-9]{1}[0-9]{3})[.\-]([1-9]|1[1-2])[.\-]([0-2][0-9]|3[0-1])$
这个正则表达式判断的日期的日部分若不满2位需自行补零。
实例2
如何判断一段字符串是否是一个com结尾或org结尾的网址,解决方案如下。
一个网址一般开始都是www,所以检测开始是不是三个w,一般情况若只需要检查一个字符可以不需要加[]。然后就是.了,因为.在正则中属于元字符,所以需要在前面加上\标识这是一个字符。中间部分是英文字符,可以大写或者小写。然后再加上一个\.。之后判断结尾是不是为com或org。开头结尾需加上^和$,因为www为本字符串开头,而com或org为结尾。
^w{3}\.[a-zA-Z]{1,}\.(com|org)$