深入理解ES6 ---- 正則擴充套件

漓漾li發表於2019-03-25

u修飾符

es5只能識別utf-16基本面上的二位元組字元,而對於代理對(unicode碼大於u+FFFF)的四位元組字元,會解析為兩個二進位制字元。詳細瞭解javascript的編碼相關

(1) unicode屬性

布林值,表示是否使用u修飾符

(2) 正則匹配

使用u修飾符,正則能夠識別4位元組的utf-16編碼字元為單個字元,即能夠從編碼單元模式轉化為字元模式

  • 不使用u操作符,正則把\uD83D\uDC2A視為兩個2位元組字元
/^\uD83D/.test('\uD83D\uDC2A') // true
複製程式碼
  • 使用u修飾符後,成功識別\uD83D\uDC2A為四位元組單字元,匹配失敗
/^\uD83D/u.test('\uD83D\uDC2A') // false
複製程式碼

(3) .任意單字元匹配

.表示除了換行符以外的任意單個字元,但不能識別4位元組字元,必須使用u修飾符

var s = '?';
/^.$/.test(s) // false
/^.$/u.test(s) // true
複製程式碼

(4) unicode表示法

/\u0061/.test('a')true,但當字元unicode碼超出u+ffff時,比如/\u20bb7/正則就不能正常匹配?了,可以使用u修飾符搭配上大括號就能識別了。

// 不能識別代理對的字元
/\u20bb7/.test('?') // false
// 使用u修飾符即可
/\u{20bb7}/u.test('?')  // true   
複製程式碼

y修飾符

(1) sticky屬性

布林值。表示正則是否使用y修飾符

(2) 多次匹配規則

使用y修飾符,正則可以對同一個字串進行多次匹配,正則會修改它的lastIndex屬性(初始值為0)為匹配內容的下一個字元的位置索引,下次匹配會從字串lastIndex處開始匹配,直到匹配失敗,lastIndex設定為0

(3) 只有在reg.execreg.test等正則方法中,才會有粘連效果

(4) 與g修飾符的區別

gy修飾符都可以多次匹配同一字串。區別在於 y修飾符等同於每次匹配時加上了 ^,從開頭處匹配;而g修飾符只是正常從lastIndex開始匹配;

###正規表示式的複製

var reg = /abc/i
reg2 = new RegExp(reg, 'g')
複製程式碼

上一段程式碼,在es5環境中會報錯;在es6環境中,會成功把i修飾符替換為g

s修飾符

(1) dotAll屬性

布林值。表示正則是否使用s修飾符

(2) 可以成功匹配行終止符

'.'代表任意單個字元,但有兩個例外:

  • 一個是四個位元組的 UTF-16 字元,這個可以用u修飾符解決
  • 另一個是行終止符
    • U+000A 換行符(\n)
    • U+000D 回車符(\r)
    • U+2028 行分隔符(line separator)
    • U+2029 段分隔符(paragraph separator)

使用s修飾符可以成功匹配行終止符

/foo.bar/.test('foo\nbar')  // false
/foo.bar/s.test('foo\nbar')  // true
複製程式碼

相關文章