ES6学习总结之 正则表达式

整体来说,ES6对正则表达式的更新和改变不多也不难,下面简单总结于下

1.RegExp构造函数

ES5 RegExp构造函数只能接受字符串作为参数,而ES6中,其可以接受正则表达式作为参数

var reg = new RegExp(/xyz/i)

如果使用RegExp的构造函数的第二个参数指定修饰符,那么返回的正则表达式会忽略其原有的的修饰符

 

2.字符串的正则方法

字符串的四个可以使用正则表达式的方法:match(),replace(),search(),split(),ES6中在语言内部都调用了RegExp的实例方法,

从而做到所有与正则相关的方法都定义在RegExp对象上

3.u修饰符

ES6中的u修饰符专门用来正确处理大于 \uFFFF的Unicode字符,可以正确的处理4个字节的UTF-16编码

/^\uD83D/u.test('\uD83D\uDC2A') // false

/^\uD83D/.test('\uD83D\uDC2A') // true

上述代码中,test内的内容是一个4字节的UTF-16编码,代表一个字符。由于ES5不支持4字节的UTF-16编码,会将其识别为2个字符,导致第二行匹配成功,结果为true;

而第一行,加了u修饰符,ES6就会将其识别为一个字符,所以匹配不成功,结果为false。

3.1 点字符

点字符在正则表达式中表示除了换行符以外的任意单个字符,对于码点 大于0xFFFF的unicode字符,点字符不能识别,必须加上u修饰符

var s = "𠮷"

/^.$/.test(s) //false

/^.$/u.test(s) //true

3.2 量词

使用u修饰符后,所有的量词都会正确的识别大于0xFFFF的Unicode字符

/𠮷{2}/.test('𠮷𠮷') //false

/𠮷{2}/u.test('𠮷𠮷') //true

3.3 预定义模式

u修饰符也影响到预定义模式能否正确识别码点 大于0xFFFF的unicode字符

/^\S$/.test('𠮷') //false

/^\S$/u.test('𠮷') //true

3.4 i修饰符

有些Unicode字符编码不同,但是字型很接近,比如 \u004B 和 \u212A 都是大写的K,不加u修饰符,就无法识别非规范的K字符

/[a-z]/i.test('\u212A') //false

/[a-z]/iu.test('\u212A') //true

 

4.y修饰符

ES6新增加了y修饰符,叫做黏连修饰符(sticky)。

y修饰符和g修饰符类似,也是全局匹配,后一次匹配都从第一次匹配成功的下一个位置开始。不同之处在于,g修饰符只要剩余位置中存在匹配就行,而y修饰符会确保匹配必须从剩余的第一个位置开始,

这就是黏连的意思

var s = "bbb_bb_b"

var p1 = /b+/g

var p2 = /b+/y

p1.exec(s) = ["bbb"]

p2.exec(s) = ["bbb"]

p1.exec(s) = ["bb"]

p2.exec(s) = null

 

5.sticky属性

与y修饰符相匹配,ES6的正则对象多了sticky属性,表示是否设置了y修饰符

var r = /hello\d/y

r.sticky = true

6.flags属性

ES6为正则表达式新增了flags属性,会返回正则表达式的修饰符

/dss/ig.flags //'gi'

 

posted @ 2017-08-19 09:43  百兽凯多  阅读(647)  评论(0编辑  收藏  举报