正则表达式常用方法

76 阅读2分钟

在工作中发现自己对正则的使用不熟练,许多常用的用法经常忘记,故借此机会回顾总结一下。

正则表达式主要用来进行字符串的匹配,从而进行替换或者判断某个字符是否符合某种规则。创建正则的方式有两种,一种是比较常用到的字面量形式let reg = /^\d+/,一种是构造函数的形式let reg = new RegExp("^\d+"), 都表示匹配若干个数字组成的字符串。

有一些约定好的、特殊的、能够同时匹配多个字符的正则表达式如下:

含义正则表达式
除了换行符之外的任何字符.
单个数字, [0-9]\d
除了[0-9]\D
包括下划线在内的单个字符,[A-Za-z0-9_]\w
非单字字符\W
匹配空白字符,包括空格、制表符、换页符和换行符\s
匹配非空白字符\S

有一些量词元字符也有特殊的含义,如下:

含义符号
0次或者1次?
0次及以上*
1次及以上+
出现x次{x}
出现n次到m次(都为闭区间){n,m}
出现n次以上{n,}

关于位置边界的一些特殊标志也总结如下:

含义符号
单词边界\b
非单词边界\B
字符串开头^
字符串结尾m
不区分大小写i
全局匹配g

何谓单词边界,其实大致可以定义为\w和\W之间的位置、^与\w之间的位置、\w与$之间的位置。

除了以上几种表示位置的符号,还有(?=p)、(?!p)、(?<=)、(?<!p),其中(?=p)和(?!p)是含义相反的一对,同理(?<=p)和(?<!p)是另一对。

(?=p)表示符合p子模式前面的那个位置,比如一个字符串let str = 'it is a string'/(?=a)/则可以匹配到a前面那个位置,于是可以通过str.replace(/(?=a)/,'not ')使得字符串变成'it is not a string'。(?!p意思于(?=p)相反,/?!a代表匹配到非a字符前面的位置,想匹配所有位置则需加上全局匹配str.replace(/(?!a)/g,'*'),字符串变成*i*t* *i*s* a* *s*t*r*i*n*g*

(?<=)表示符合p子模式后面的那个位置,(?<!p)表示符合p子模式非其后面的位置。与上面同理,不再赘述。

字符串匹配时候可以使用?、*、+、{x}、{n,m}、{n,}进行模糊匹配。