ES6:正则的扩展

正则的扩展

新的构造模式

//在ES5中,下列语法是不允许的,而ES6可以实现
var reg = new RegExp(/xyz/,'i');

//如果第二个参数存在,则第一个参数的flag将失效
var reg = new RegExp(/xyz/i,'g')	//'/xyz/g'

U修饰符

ES6增加了u修饰符,含义为’Unicode模式’,用来处理大于\uFFFF的Unicode字符,

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

上面的代码中,\uD83D\uDC2A 是一个4字节的 UTF-16 编码,代表一个字符。但是,ES5 不支持 4 字节的 UTF-16 编码,会将其识别为 2 个字符,导致第二行代码结果为 true。 加了 u 修饰符以后, ES6 就会识别其为一个字符,所以第一行代码结果为 false。

Unicode字符表示法

ES6 新增了使用大括号表示 Unicode 字符的表示法,这种表示法在正则表达式中必须加上 u 修饰符才能识别当中的大括号,否则会被解读为量词。

/\ u{61}/.test (’ a ’)	//false
/\ u{61}/u.test (’a ’)	//true
/\u{20BB7}/u.test('击')	//true

量词

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

/击{2}/.test('击击')	//false
/{2}/u.test('击击')	//true

y修饰符

除了 u 修饰符, ES6 还为正则表达式添加了 y 修饰符,叫作“粘连”(sticky)修饰符。
y 修饰符的作用与 g 修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一 个位置开始。不同之处在于, g 修饰符只要剩余位置中存在匹配就行,而 y 修饰符会确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的涵义。

var str = 'aaa_aa_a'
var r1 = /a+/g
var r2 = /a+/y

r1.exec(str)	//['aaa']
r2.exec(str)	//['aaa']

r1.exec(str)	//['aa']
r2.exec(str)	//['null'],因为第一个匹配的字符是'_'

r2.exec(str)	//['aa']

点字符的新特性

正则表达式中,点(.)是一个特殊字符,代表任意的单个字符,但是行终止符(line terminator character)除外。

/foo.bar/.test('foo\nbar')		//false
/foo.bar/s.test('foo]nbar')		//true

s修饰符被称为dotAll模式,即点代表一切字符。所以,正则表达式引入了dotAll属性,返回布尔值,表示该正则表达式是否处于dotAll模式下。

const re = /foo.bar/s;
re.test('foo\nbar')	//true
re.dotAll 	//true
re.flags	//'s'

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值