正则总结

781 阅读3分钟

基础知识

选择符

|这个符号代表选择修释符,也就是 | 左右两侧有一个匹配到就可以

字符转义

转义用于改变字符的含义,如果想通过正则查找/符号,但是 /在正则中有特殊的意义。如果写成///这会造成解析错误,所以要使用转义语法 /\//来匹配

字符边界

使用字符边界符用于控制匹配内容的开始与结束约定

^: 匹配字符串的开始

$:匹配字符串的结束,忽略换行符

修饰符

i:ingore case,忽略大小写

g:global,全局匹配

m:multi-line,多行匹配

s:默认情况下的圆点 . 是 匹配除换行符 \n 之外的任何字符,加上 s 之后, . 中包含换行符 \n

原子表

在一组字符中匹配某个元字符,在正则表达式中通过元字符表来完成,就是放到[] (方括号)中。

原子表说明
[]只匹配其中的一个原子
[^]只匹配除了其中字符的任意一个原子
[0-9]匹配 0-9 任何一个数字
[a-z]匹配小写 a-z 任何一个字母
[A-Z]匹配大写 A-Z 任何一个字母
[xyz]匹配包含 xyz 的任意一个字母
[^xyz]匹配未包含 xyz 的任意字符

元字符

元字符说明
.匹配除换行符外的任意字符
\f匹配一个换页符
\n匹配一个换行符
\r匹配一个回车符
\d匹配一个数字字符。等价于 [0-9]
\D匹配一个非数字字符。等价于[^0-9]
\w匹配字母、数字、下划线。等价于[A-Za-z0-9_]
\W匹配非字母、数字、下划线。等价于[^a-za-z_]
\s匹配任何空白字符,包括空格、制表符、换页符。等价于 [\f\n\r\t\v]
\S匹配任何非空白字符。等价于[^\n\f\r\t\v]
\b匹配一个单词边界,也就是指单词和空格间的位置
\B匹配非单词边界

所有字符

可以使用 [\s\S][\d\D] 来匹配所有字符

原子组

如果一次要匹配多个元子,可以通过元子组完成。

原子组与原子表的差别在于原子组一次匹配多个元子,而原子表则是匹配任意一个字符

元字符组用 () 包裹

重复匹配

符号说明
{n}重复 n 次
{n,}重复 n 次或更多次
{n,m}重复 n 到 m 次
*匹配前一个表达式 0 次或多次。等价于 {0,}
+匹配前面一个表达式 1 次或者多次。等价于 {1,}
匹配前面一个表达式 0 次或者 1 次。等价于 {0,1}
?=n匹配任何其后紧接着指定字符串 n 的字符串

默认情况下重复选项对单个字符进行重复匹配,即不是贪婪匹配

var str = `abbbbb`,
  reg = /ab+/i;
console.log(str.match(reg)); // ["abbbbb", index: 0, input: "abbbbb", groups: undefined]

使用原子组后则对整个组重复匹配

断言匹配

x(?=y)匹配'x'仅仅当'x'后面跟着'y'.这种叫做先行断言

(?<=y)x匹配'x'仅当'x'前面是'y'.这种叫做后行断言

x(?!y)仅仅当'x'后面不跟着'y'时匹配'x',这被称为正向否定查找

(?<!y)x仅仅当'x'前面不是'y'时匹配'x',这被称为反向否定查找

贪婪模式和非贪婪模式

正则表达式在进行重复匹配时,默认是贪婪匹配模式,也就是说会尽量匹配更多内容,但是有的时候我们并不希望他匹配更多内容,这时可以通过?进行修饰来禁止重复匹配。

符号说明
*?重复任意次,但尽可能少重复
+?重复 1 次或更多次,但尽可能少重复
??重复 0 次或 1 次,但尽可能少重复
{n,m}?重复 n 到 m 次,但尽可能少重复
{n,}?重复 n 次以上,但尽可能少重复