佳宸学习和分享笔记的地方

0%

JS中的正则

方法

方法描述
RegExp.prototype.exec一个在字符串中执行查找匹配的RegExp方法,它返回一个数组(未匹配到则返回 null)。
RegExp.prototype.test一个在字符串中测试是否匹配的RegExp方法,它返回 true 或 false
String.prototype.match一个在字符串中执行查找匹配的String方法,它返回一个数组,在未匹配到时会返回 null。
String.prototype.matchAll一个在字符串中执行查找所有匹配的String方法,它返回一个迭代器(iterator)。
String.prototype.search一个在字符串中测试匹配的String方法,它返回匹配到的位置索引,或者在失败时返回-1。
String.prototype.replace一个在字符串中执行查找匹配的String方法,并且使用替换字符串替换掉匹配到的子字符串。
String.prototype.split一个使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的子字符串存储到数组中的 String 方法。

符号表格

特殊字符正则表达式记忆方式
换行符\nnew line
换页符\fform feed
回车符\rreturn
空白符\sspace
非空白符\S
制表符\ttab
垂直制表符\vvertical tab
单词边界\bboundary
非单词边界\B
回退符[\b]backspace,之所以使用[]符号是避免和\b重复
除了换行符之外的任何字符.句号,除了句子结束符
单个数字, [0-9]\ddigit
除了[0-9]\Dnot digit
包括下划线在内的单个字符,[A-Za-z0-9_]\wword
非单字字符\Wnot word
0 或1个字符,惰性匹配?有无?
大于0个字符*
大于1个字符++1
分组()
匹配区间集合[ ][0-9] , [a-z]
匹配重复次数{ }
  • {x}: x次
  • {min, max}: 介于min次到max次之间
  • {min, }: 至少min次
  • {0, max}: 至多max次
边界和标志正则表达式记忆方式
字符串开头^
字符串结尾$
多行模式m标志multiple of lines
忽略大小写i标志ignore case, case-insensitive
全局模式g标志global

(?=p)和(?!p)的理解

(?=p),其中p是一个子模式,即p前面的位置

比如(?=l),表示’l’字符前面的位置,例如:

1
2
3
4
// 匹配l前面的位置
var result = "hello".replace(/(?=l)/g, '#');
console.log(result);
// => "he#l#lo"

(?!p)就是(?=p)的反面意思,比如:

1
2
3
4
var result = "hello".replace(/(?!l)/g, '#');

console.log(result);
// => "#h#ell#o#"

反向引用

反向引用:

1
2
3
4
5
6
7
8
9
var regex = /\d{4}(-|\/|\.)\d{2}\1\d{2}/;
var string1 = "2017-06-12";
var string2 = "2017/06/12";
var string3 = "2017.06.12";
var string4 = "2016-06/12";
console.log( regex.test(string1) ); // true
console.log( regex.test(string2) ); // true
console.log( regex.test(string3) ); // true
console.log( regex.test(string4) ); // false

注意里面的\1,表示的引用之前小括号的那个分组(-|\/|\.)

\2\3即分别指代第二个和第三个分组。

括号嵌套以左括号为准

1
2
3
4
5
6
7
var regex = /^((\d)(\d(\d)))\1\2\3\4$/;
var string = "1231231233";
console.log( regex.test(string) ); // true
console.log( RegExp.$1 ); // 123
console.log( RegExp.$2 ); // 1
console.log( RegExp.$3 ); // 23
console.log( RegExp.$4 ); // 3

更复杂的正则 参考推荐老姚写的正则迷你书:https://juejin.im/post/5965943ff265da6c30653879#heading-5