一直都只会写简单的正则,平时也基本不写,就连 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. 捕获组

    1
    2
    3
    
    var reg = /a(\d+)/g;
    "2017.07.07".match(reg);
    RegExp.$1; // "2017"
    
  2. 非捕获组?:

    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,发现不合适再回溯,影响性能。

改进

1
var reg = /"[^"]"/g;

参考

javascript 正则表达式迷你书