前言: 请你熟悉基本的正则表达式之后再来看此文章
首先回一下正则的定义方法
- 正则的定义
let regExp = new RegExp('xyz', 'i');
// 等价于
let regExp = /xyz/i;
如上,创建了一个正则构造函数,第一个参数是匹配的字符串,第二个参数为修饰符
还有一种是参数可以直接是正则表达式
let regExp = new RegExp(/xyz/i);
// 等价于
let regExp = /xyz/i;
但是,这样写了之后,你的参数在es5中就不能写第二个参数了,否则报错。
es6恰巧完善了该写法、
let regExp = new RegExp(/syz/igm, 'i')
此时前面的(igm)修饰符就会被第二个参数,(i)修饰符替换掉
-
字符串的正则方法
match()、replace()、search()、split()
这四个方法,都定义在正则对象上
String.prototype.match 调用 RegExp.prototype[Symbol.match] String.prototype.replace 调用 RegExp.prototype[Symbol.replace] String.prototype.search 调用 RegExp.prototype[Symbol.search] String.prototype.split 调用 RegExp.prototype[Symbol.split]
-
新增的U修饰符
含义就是unicode模式,用来处理大于/uFFFF的Unicode字符,会正确处理四个字节的Utf-16编码
let str = '\uD83D\uDC2A';
// 四个字节的utf-16
let reg = /^\uD83D/u;
let oldReg = /^\uD83D/;
reg.test(str);
// false;
oldReg.test(str);
// true;
es5中不支持四个字节的UTF-16,会识别为2个字符,导致不加u的正则匹配为true。
加了就会识别为一个字符,所以加了u修饰符的为false。
一旦加了u修饰符就会更改一些正则的行为
-
点字符
点(.)在正则中表示除了换行以外任意单个字符,对于码点大于0xFFFF点字符不能识别,必须加上u修饰符
let s = '𠮷';
/^./.test(s);
// false
/^./u.test(s);
// true
-
unicode表示法
es6新增大括号表示unicode字符,这种在正则中必须使用u修饰符,否则会被识别为量词
/\u{61}/.test('a');
// false
/\u{
61}/u.test('a');
// true
/\u{
20BB7}/u.test('𠮷');
// true
如果上面的u{61}不加u修饰符,程序就会认为这是匹配了61个连续的u
-
量词
使用u修饰符,程序都会识别大于0xFFFF的unicode编码
/a{2}/.test('aa');
// true
/a{
2}/u.test('aa');
// true
/𠮷{
2}/.test('𠮷𠮷');
// false
/𠮷{
2}/u