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个:es6
修饰符 | 描述 | 描述 |
---|---|---|
m | multiline | 多行模式 |
i | ignore case | 忽略大小写模式 |
g | global match | 全局匹配模式 |
u | unicode | unicode模式 |
y | sticky | 粘连模式 |
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,后一个是假的),博主也不知道为啥会这样!prototype
y 修饰符设计
和全局修饰符(g)相似,执行全局匹配,但 g 只有剩余位置存在匹配便可,y 则必须中上次匹配的下一个字母开始。code
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修饰符就是为了让起始位置匹配 ^ 在全局有效才设计使用的。unicode
与此同时,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\. 获得正则表达式的字符串转译写法