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.exec
和reg.test
等正則方法中,才會有粘連效果
(4) 與g修飾符的區別
g
、y
修飾符都可以多次匹配同一字串。區別在於 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
複製程式碼