整理学习——ES6正则的扩展

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

返回正则表达式的修饰符

转载整理自:http://caibaojian.com/es6/regex.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值