在工作中发现自己对正则的使用不熟练,许多常用的用法经常忘记,故借此机会回顾总结一下。
正则表达式主要用来进行字符串的匹配,从而进行替换或者判断某个字符是否符合某种规则。创建正则的方式有两种,一种是比较常用到的字面量形式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,}进行模糊匹配。