正则表达式

  • Post author:
  • Post category:其他




正则表达式

正则表达式,又称规则表达式,(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位,至少出现三种类型的字符

如果要写正则表达式去匹配,是不太容易的,即使写出来,保证这个表达式的正确性又是很大的问题,除非熟练掌握了正则表达式

而用代码去实现的话,就非常容易实现,思路清晰,后期维护也简单

所以,不应该滥用正则表达式,使用正则表达式只是为了方便开发,如果使得开发变得复杂就得不偿失了



版权声明:本文为weixin_52115456原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。