• 构造函数支持传入正则得到拷贝,同时可以用第二参修改修饰符

      1. var reg = /^abc/ig;
      2. var newReg_ig = new RegExp(reg); //newReg_ig = /^abc/ig;
      3. var newReg_g = new RegExp(reg,'g'); //newReg_g = /^abc/g;
    • 引入新的修饰符
      ES5中的修饰符有3个, 加上 ES6 的修饰符,一共5个: | 修饰符 | 描述 | 描述 | | —- | —- | —- | | m | multiline | 多行模式 | | i | ignore case | 忽略大小写模式 | | g | global match | 全局匹配模式 | | u | unicode | unicode模式 | | y | sticky | 粘连模式 |

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

    1. //情况1:
    2. /^\uD83D/.test("\uD83D\uDC2A"); //true, 很明显这个是不对的, 因为 \uD83D\uDC2A 是一个字,不能拆开
    3. /^\uD83D/u.test("\uD83D\uDC2A"); //false
    4. //情况2
    5. var s = "?";
    6. /^.$/.test(s); //false, 通配符 . 不能匹配32位unicode
    7. /^.$/u.test(s); //true
    8. //情况3
    9. var s = "?a";
    10. /\u{63}/.test(s); //false, 不能使用{}形式的 unicode,被电脑认为 u 出现63次
    11. /\u{63}/u.test(s); //false, 即使用了 u 也一样
    12. //为了避免这种误解,合理使用 u 修饰符
    13. //情况3
    14. var s = "?";
    15. /^\S$/.test(s); //false, \S 无法监测到32位 unicode
    16. /^\S$/u.test(s); //true

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

    1. var k1 = "\u004B";
    2. var k2 = "\u212A";
    3. /[a-z]/i.test(k1); //true
    4. /[a-z]/iu.test(k1); //true
    5. /[a-z]/i.test(k2); //false
    6. /[a-z]/iu.test(k2); //true

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

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

    1. var s = 'aaa_aa_a';
    2. var r1 = /a+/g;
    3. var r2 = /a+/y;
    4. r1.exec(s); //["aaa"], 剩余字符是 '_aa_a'
    5. r2.exec(s); //["aaa"], 剩余字符是 '_aa_a'
    6. r1.exec(s); //["aa"], 限定起始点,得到 aa, 剩余字符是 '_a'
    7. r2.exec(s); //null, 必须从剩余字符的第一个就匹配到,相当于 /^a+/g, 由于匹配不到返回 null,同时将 lastIndex 置 0
    8. r1.exec(s); //["a"], 剩余字符是 ''
    9. r2.exec(s); //["aaa"], 剩余字符是 '_aa_a'

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

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

    1. var reg = /^abc/uy;
    2. reg.sticky; //true, 判断reg是否是粘连模式
    3. reg.unicode; //true, 判断reg是否是unicode模式
    4. reg.flags; //'uy', 得到其全部修饰符构成的字符串
    5. reg.source; //'^abc' 得到正则表达式字符串
    6. var str="^abc."
    7. RegExp.escape(str); //\^abc\. 得到正则表达式的字符串转译写法