一直都只会写简单的正则,平时也基本不写,就连 test,exec,match 是谁的方法都分不清。笔记主要参考《javascript 正则表达式迷你书》
基本语法
字符组[]
1
2
3
4
|
// abc中的任意一个
var reg1 = /[abc]/;
// a到z中的任意一个
var reg2 = /[a-z]/;
|
量词{}
1
2
|
// 数组匹配3次到4次
var reg1 = /\d{3,4}/;
|
分组()
捕获组
1
2
3
|
var reg = /a(\d+)/g;
"2017.07.07".match(reg);
RegExp.$1; // "2017"
|
非捕获组?:
1
2
3
|
var reg = /a(?:\d+)/g;
"2017.07.07".match(reg);
RegExp.$1; // ""
|
反向引用\数值
1
2
|
var reg = /(\d{2,3})hello\1/g;
console.log(reg.test("11hello11")); // true
|
匹配位置^ $ ?= ?! \b \B
1
2
3
4
|
var reg = /^ab$/g;
console.log(reg.test("ab")); //true
var reg1 = /(?=ab)ab.*?ab/;
console.log(reg1.test("abab111ab")); // true
|
惰性匹配?
1
2
|
var reg = /a.+?/g;
console.log("abbbb".match(reg)); // ab
|
优化
回溯
看如下正则
1
2
|
var reg = /".*"/g;
console.log('"asda"qwe'.match(reg));
|
当用上面的正则匹配时,会放生回溯,由于贪婪特性,会一直匹配到 e,发现不合适再回溯,影响性能。
改进
参考
javascript 正则表达式迷你书