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\. 獲得正則表達式的字符串轉譯寫法