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個: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\. 獲得正則表達式的字符串轉譯寫法
相關文章
相關標籤/搜索