正则表达式
正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为”元字符”),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开来的,后来在广泛运用于Scala 、PHP、C# 、Java、C++ 、Objective-c、Perl 、Swift、VBScript 、Javascript、Ruby 以及Python等等。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
用法
符号 | 作用 |
---|---|
$ | 匹配结束符号,例如表达式/abc$/g,匹配字符串abc是可以匹配上的,因为匹配完c后结束符号也匹配上了,如果匹配abcd,那么$就和d进行匹配,匹配失败 |
( ) | 可以改变表达式的优先级,例如表达式/ab+/g,因为+号优先级高,所以这个表达式可以匹配ab、abb、abbb…,加了括号后/(ab)+/g,所匹配的就是ab、abab、abab… |
* | 星号前的表达式可以重复匹配0次至无限次,例如表达式/ab*/g,可以匹配a、ab、abb、abbb… |
+ | 加号前的表达式可以重复匹配1次至无限次,例如表达式/ab+/g,可以匹配ab、abb、abbb…,但是不可以匹配a,因为+号至少匹配一次 |
[ ] | []中括号可以限制匹配单个字符的字符集,例如 [0-9] 代表匹配的这个字符可以是0、1、2…9,也可以匹配多个种字符 [a-z0-9],代表匹配的这个字符可以是a-z也可以是0-9 |
? | ?号前的表达式可以匹配0次或一次,例如表达式/ab?/g,只能匹配a和ab |
\ | 转义字符,如果需要匹配$()^{}等特殊符号,可以这样使用:\$、\(、\)、\^等等 |
^ | 在正常表达式中,匹配开始字符,例如表达式/^abc/g匹配abc是可以匹配成功的,但是匹配dabc是匹配不成功的,因为a不是开始字符。在 [ ] 表达式中,^表示非的意思,例如 [^0-9] 代表匹配的这个字符不能是数字 |
{ } | { }是限制符号,可以在里面添加限制条件,下面{n}、{n,}详细介绍 |
| | 或者符号,例如 [a|b] 代表匹配的字符可以是a或者b |
{n} | 可以重复匹配前面的表达式 n 次,例如/ab{2}/g,那么只能匹配abb |
{n,} | 至少重复匹配前面的表达式 n 次,例如/ab{2,}/g,那么可以匹配abb、abbb、abbbb… |
{n,m} | 重复匹配前面的表达式 n 到 m 次,例如/ab{2,4}/g,那么只可以匹配abb、abbb、abbbb |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\t | 匹配一个制表符,tap符号 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v,匹配的字符只能是 \f、\n、\r、\t、\v这些字符。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v],^是非的意思,匹配的字符不能是 \f、\n、\r、\t、\v这些字符 |
\b | 匹配一个单词边界,即字与空格间的位置。例如/\bab/g,匹配gg abhab的时候,只能匹配成功第一个ab,而第二个匹配不成功,因为\b没有匹配到边界单词 |
\B | 非单词边界匹配,例如/\bab/g,匹配gg abhab的时候,只能匹配成功第二个ab,而第一个匹配不成功,因为\B没有匹配到非边界单词 |
exp1(?=exp2) | 查找 exp2 前面的 exp1 |
(?<=exp2)exp1 | 查找 exp2 后面的 exp1 |
exp1(?!exp2) | 查找后面不是 exp2 的 exp1 |
(?<!exp2)exp1 | 查找前面不是 exp2 的 exp1 |
个人理解
正则表达式在一定程度上可以方便开发,使用场景也是非常多的,例如使用linux命令查找文件,对文件内容进行查找、替换等操作,在开发判断参数的合法性等等,只需要使用简单的表达式就可以达到效果,而不需要额外去写程序
但对比于一些复杂的问题不建议使用正则表达式去解决,例如检验密码是否符合以下要求:
至少8位最多16位,至少出现三种类型的字符
如果要写正则表达式去匹配,是不太容易的,即使写出来,保证这个表达式的正确性又是很大的问题,除非熟练掌握了正则表达式
而用代码去实现的话,就非常容易实现,思路清晰,后期维护也简单
所以,不应该滥用正则表达式,使用正则表达式只是为了方便开发,如果使得开发变得复杂就得不偿失了