ECMAScript6(9):正则表达式的扩展

正则表达式扩展

  • 构造函数支持传入正则得到拷贝,同时可以用第二参修改修饰符
var reg = /^abc/ig;
var newReg_ig = new RegExp(reg);      //newReg_ig = /^abc/ig;
var newReg_g = new RegExp(reg,'g');      //newReg_g = /^abc/g;
  • 引入新的修饰符
    ES5中的修饰符有3个, 加上 ES6 的修饰符,一共5个:
修饰符描述描述
mmultiline多行模式
iignore case忽略大小写模式
gglobal match全局匹配模式
uunicodeunicode模式
ysticky粘连模式

unicode 模式
为了兼容 4 自己 unicode, 我们需要在一下情况使用该模式

//情况1:
/^\uD83D/.test("\uD83D\uDC2A");   //true, 很明显这个是不对的, 因为 \uD83D\uDC2A 是一个字,不能拆开
/^\uD83D/u.test("\uD83D\uDC2A");   //false

//情况2
var s = "��";
/^.$/.test(s);     //false, 通配符 . 不能匹配32位unicode
/^.$/u.test(s);     //true

//情况3
var s = "��a";
/\u{63}/.test(s);     //false, 不能使用{}形式的 unicode,被电脑认为 u 出现63次
/\u{63}/u.test(s);     //false, 即使用了 u 也一样
//为了避免这种误解,合理使用 u 修饰符

//情况3
var s = "��";
/^\S$/.test(s);     //false, \S 无法监测到32位 unicode
/^\S$/u.test(s);     //true

当然这个里面还是有坑的,比如下面这个:

var k1 = "\u004B";
var k2 = "\u212A";

/[a-z]/i.test(k1);     //true
/[a-z]/iu.test(k1);     //true
/[a-z]/i.test(k2);     //false
/[a-z]/iu.test(k2);     //true

第三个输出居然是 false?根本没有32位 unicode 呀,干嘛用u修饰? 其实 "\u004B""\u212A" 都是 K(前一个是真 K,后一个是假的),博主也不知道为啥会这样!

y 修饰符

和全局修饰符(g)类似,执行全局匹配,但 g 只有剩余位置存在匹配即可,y 则必须中上次匹配的下一个字母开始。

var s = 'aaa_aa_a';
var r1 = /a+/g;
var r2 = /a+/y;

r1.exec(s);  //["aaa"], 剩余字符是 '_aa_a'
r2.exec(s);  //["aaa"], 剩余字符是 '_aa_a'

r1.exec(s);  //["aa"], 限定起始点,得到 aa, 剩余字符是 '_a'
r2.exec(s);  //null, 必须从剩余字符的第一个就匹配到,相当于 /^a+/g, 由于匹配不到返回 null,同时将 lastIndex 置 0

r1.exec(s);  //["a"], 剩余字符是 ''
r2.exec(s);  //["aaa"], 剩余字符是 '_aa_a'

y修饰符就是为了让起始位置匹配 ^ 在全局有效才设计使用的。

与此同时,es6 中的 RegExp.prototype 也加入了一些新的属性:

var reg = /^abc/uy;
reg.sticky;   //true, 判断reg是否是粘连模式
reg.unicode;  //true, 判断reg是否是unicode模式
reg.flags;    //'uy', 得到其全部修饰符构成的字符串
reg.source;   //'^abc' 得到正则表达式字符串
var str="^abc."
RegExp.escape(str);  //\^abc\. 得到正则表达式的字符串转译写法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值