RegExp(regExp[,modifier])
第一个参数为正则,可以使用第二个参数指定修饰符。返回的正则会忽略原有正则的修饰符,仅使用指定的修饰符。
new RegExp(/abc/ig, 'i').flags
// "i"
字符串
正则方法
将match()、replace()、search()、split()在语言内部全部调用RegExp的实例方法。
做到所有与正则相关的方法,全部定义在RegExp对象上。
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编码。
添加u修饰符,会将判断对象识别为一个字符,例如
/^\uD83D/u.test('\uD83D\uDC2A')
//Output: false
/^\uD83D\uDC2A/u.test('\uD83D\uDC2A')
//Output: true
.(点字符)
除\n以外的任意单个字符。对于码点大于0xFFFF的Unicode字符,不能识别。加上u修饰符可以识别
var s = '?';
/^.$/.test(s);
//Output: false
/^.$/u.test(s);
//Output: true
Unicode字符表示法
使用大括号表示Unicode字符时,必须在正则中加上u修饰符才能识别,如果不加会被认为是匹配61个连续的u
var str = '', u = 'u';
for(let i = 0; i< 61;i++){
str += u;
}
console.log(
/\u{61}/.test('a'),
/\u{61}/u.test('a'),
/\u{61}/.test(str)
)
//Output: false true true
量词
使用u修饰符后,所有量词都会正确识别码点大于0xFFFF的Unicode字符
console.log(
/?{2}/.test("??"),
/?{2}/u.test("??")
)
//Output: false true
预定义模式
使用后,正确匹配码点大于0xFFFF的Unicode字符
var s = "??";
s.match(/[\s\S]/gu);
//Output: ["?", "?"]
s.match(/[\s\S]/g);
//Output: ["�", "�", "�", "�"]
i修饰符
识别字形相近但编码不同的非规范字符
console.log('\u004B', '\u212A');
//Output: K K
console.log(
/[a-z]/i.test('\u004B'),
/[a-z]/i.test('\u212A'),
/[a-z]/iu.test('\u004B'),
/[a-z]/iu.test('\u212A')
);
//Output: true false true true
y修饰符
粘连修饰符,全局匹配。
与g修饰符的差别
y修饰符:确保匹配必须从剩余位置的第一个位置开始,相当于在开头加了^进行匹配
g修饰符:只要剩余位置存在匹配即可
匹配字符串时,如果出现非法字符,即不符合正则的字符,g修饰符会继续匹配,y修饰符会停止匹配,可以利用这个区别进行错误判断。
var s = 'aaaa_aaa_aa_a';
var r1 = /a+/g;
var r2 = /a+/y;
var r3 = /^a+/g;
r1.exec(s);
//result: ["aaaa", index: 0, input: "aaaa_aaa_aa_a", groups: undefined]
r1.exec(s);
//result: ["aaa", index: 0, input: "aaaa_aaa_aa_a", groups: undefined]
r1.exec(s);
//result: ["aa", index: 0, input: "aaaa_aaa_aa_a", groups: undefined]
r1.exec(s);
//result: ["a", index: 0, input: "aaaa_aaa_aa_a", groups: undefined]
r2.exec(s)
//result: ["aaaa", index: 0, input: "aaaa_aaa_aa_a", groups: undefined]
//第二次匹配是从_aaa_aa_a的第一个_,因为第一个_不匹配所以返回null
r2.exec(s)
//result: null
r3.exec(s)
//result: ["aaaa", index: 0, input: "aaaa_aaa_aa_a", groups: undefined]
r3.exec(s)
//result: null
sticky属性
表示是否设置了y修饰符
var r = /hello\d/y,
n = /hello\d/;
console.log(r.sticky, n.sticky)
//Output: true false
flags
返回正则表达式的修饰符