Skip to content

js 正在表达式高级用法记忆

  1. 非捕获 (?:x) x 参与匹配但是不参与捕获
  2. 断言 x(?=y) y 参与匹配, 但是不出现在匹配的子串中 /x(?=y)/.exec("xy")[0]="x", 和非捕获的差别是 /x(?=y)/.exec("xy")[0]="xy"
  3. x(?!y) 表示 x 后面不跟 y
  4. (?<=y)x x 前面是 y
  5. (?<!y)x x 前面是不是 y
  6. 正则默认是贪婪匹配,在数量词后? 表示非贪婪匹配
  7. 正则表达式事深度优先原则,先一路到底,再回溯。如果出现了回溯,会使性能大幅度影响,尽量少出现回溯,数量词尽量明确。大型子串匹配时很容易出现回溯。

正则回溯举例

js
/a\d{1,3}0/.test("a220");
// 这种情况会出现一次回溯, \d{1,3} 贪婪匹配, 220 ,然后再匹配0,不复活, 回溯成\d{1,3} 匹配22

正则表达式 | 的理解

js
/99|55/; // 匹配的应该是 99 或者55 而不是 9(9|5)5

正则 exec 和 g 修饰符理解

js
var reg = /\w/;
reg.exec("abc"); // a
reg.exec("abc"); // a
reg.exec("abc"); // a

var reg = /\w/g; // 必须是变量的方式
reg.exec("abc"); // a
reg.exec("abc"); // b
reg.exec("abc"); // c

match 和 replace 中 g 修饰符

match(//g) 返回的是匹配的每个子串组成的数组,不加 g 同 exec
replace 同上, 但是使用字符串模式时, $` $' 需要注意