ES6-13【正则方法、修饰符yus、UTF_16编码方式】

一.正则方法

(1).正则回顾

基本形势

var reg = /\w/gim

修饰符解析

g - global 全局

i - ignoreCase 忽略大小写

m - mutli-line 换行

全局匹配区别

有g

['s','d','j','s',1,2,3]

无g

['s', index:0,input:'sdjflsd']

[]

填写范围[A-Za-z0-9]

(2).元字符转译

通过\转译

元字符解析

w  数字字母下划线 = word

W  !非上方条件

d  数字 =  digit [0 - 9]

D !

s  空格  = space

S !

b 单词边界 brige 桥,桥有两边所以有边界

B !

n 换行 r回车 t制表 v垂直换行 f换页

二.修饰符拓展

(1).修改内容

  1. 声明正则的变化方式
  2. 字符串上的正则方法进行了调整
  3. 新增的修饰符u y s

(2).声明正则的变更

es5的声明方式

var reg = new RegExp('xyz', 'ig') = var reg = /xyz/ig
var str = 'xyzxyz'
log(str.match(reg));
['xyz','xyz']
log(str.match(str));
['xyz','xyz']

es6的优化方案

var reg = new RegExp(/xyz/gi,'gm')
var str = 'xyz\nxyz';
log(str.match(reg));//多行依旧能匹配,以第二个参数为准 es6做的
['xyz','xyz']

(3).方法调整

 es6把这些方法新增到了RegExp上

RegExp.prototype[Symbol.match];
RegExp.prototype[Symbol.replace];
RegExp.prototype[Symbol.search];
RegExp.prototype[Symbol.split];

查看是否有没有定义的

var reg = new RegExp('xyz','ig');
log(reg.global) true
log(reg.ignoreCase) true
log(reg.multiLine) false

flags/source

会返回正则表达式所有的修饰符

var reg = /\wabed/giy
log(reg.source);//\wabed
log(reg.flags);//\giy

split

log('x##'.split(/#/y));//Array(3){0:'x' 1:'' 2:'' length:3}
log('x##'.split(/#/g));//Array(3){0:'x' 1:'' 2:'' length:3}
log('##x'.split(/#/y));//Array(3){0:'' 1:'' 2:'x' length:3}
log('#x#'.split(/#/y));//Array(3){0:'' 1:'x' 2:'' length:3}
console.log('x#x#xxxxx'.split(/#/y)); ["x", "x", "xxxxx"]
console.log('x#x#xxxx'.split(/#/g));["x", "x", "xxxx"]
/y/g在这里结果是一致得

(4).yus         

y  

y = sticky = 粘连的意思

var str = 'aaa_aa_a';
var reg1 = /a+/g;
var reg2 = /a+/y;
log(reg1.exec(str));//['aaa',index:0,input:'aaa_aa_a']
log(reg2.exec(str));//['aaa',index:0,input:'aaa_aa_a']
log(reg1.exec(str));//['aa',index:4,input:'aaa_aa_a']
log(reg2.exec(str));//null

y会判断第二个aa并不是第一个出现的而是中间出现了_这时候y就不能匹配到aa,第一个值必需要粘连到第二个值

s

匹配所有

s = dotAll

.可以匹配任何字符包括\n等等特殊,es2018实现了,目前兼容可能有问题,所以用s

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

u

js都是通过UTF16的方式保存的

常用编码区间 U+0000到U+FFFF 四个字节

unicode分区 2*16(bmp)17个平面

U+D800之后的编码没有对应字符

单纯是为了配合后面两个字符的编码的,单另拿出D842是乱码的

两个字节装不下就放两个码点

log('\uD842\uDFB7');//𠮷

u的作用

用u来解析超出编码(码点)的值

在es5中无法解析,所以只取解析前两个字符

在es6中可以通过/u识别超出编码(码点)4个字符的汉字

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

超出编码极限

var s = '\uD842\uDFB7';
log(s);//𠮷
log(/^.$/.test(s));//false es5超出了编码极限无法匹配了
log(/^.$/u.test(s));//true 

\u作为开头解析编码

log(/\u{20bb7}/u.test('𠮷
'))
//true

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值