天天看點

ES13 正則方法、修飾符yus、UTF_16編碼方式修飾符元字元ES6新增部分UTF_16

修飾符

  • m multiLine 對于str中含\n的情況
  • g global
  • i ignoreCase

元字元

  • 反斜杠加轉義
元字元 含義 簡寫
\w 比對字母、數字、下劃線。等價于’[A-Za-z0-9_]’。 word
\W 比對非字母、數字、下劃線。等價于 ‘[^A-Za-z0-9_]’。
\s 比對任何空白字元,包括空格、制表符、換頁符等等。等價于 [ \f\n\r\t\v]。 space
\S 比對任何非空白字元。等價于 [^ \f\n\r\t\v]。
[\w\W] 所有字元
\d 比對一個數字字元。等價于 [0-9]。 digit
\D 比對一個非數字字元。等價于 [^0-9]。
\b 比對一個單詞邊界,也就是指單詞和空格間的位置。 bridge border
\B 比對非單詞邊界。

ES6新增部分

1. 聲明正則的變化方式

var reg = new RegExp('xyz', i)
// 也可以 修飾符以第二個參數為準
var reg = new RegExp(/xyz/, 'i') 
// 等價于ES5
var reg = /xyz/i
           

2. 字元串上的正則方法調整

ES13 正則方法、修飾符yus、UTF_16編碼方式修飾符元字元ES6新增部分UTF_16
// ES6,當調用字元串方法match時,本質上調用的是RegExp原型上的[Symbol.match]
String.prototype.match → RegExp.prototype[Symbol.match]
String.prototype.replace → RegExp.prototype[Symbol.replace]
String.prototype.search → RegExp.prototype[Symbol.search]
String.prototype.split → RegExp.prototype[Symbol.split]
           

3. 新增的修飾符u y s

修飾符 含義 簡寫
\y 再次比對的時候看是否粘粘的,是全局的 sticky
\u 識别D800以後的4位元組文字,會将4位元組看做1個字來比對 unicode
\
\
ES13 正則方法、修飾符yus、UTF_16編碼方式修飾符元字元ES6新增部分UTF_16

y

<script>
    (function () {
        const str = "aaa_aa_a";
        const reg2 = /a+/y
        console.log(reg2.exec(str))
        console.log(reg2.exec(str))
        console.log(reg2.exec(str))
        console.log(reg2.exec(str))
    })();
</script>
<script>
    (function () {
        console.log('--------------腳本2-----------------')
        const str = "aaa_aa_a";
        const reg1 = /a+/g
        console.log(reg1.exec(str))
        console.log(reg1.exec(str))
        console.log(reg1.exec(str))
        console.log(reg1.exec(str))
    })();
</script>
           

u

console.log(/^\uD83D/.test('\uD83D\uDC2A')) // true
console.log(/^\uD83D/u.test('\uD83D\uDC2A')) // false
console.log(/^.$/.test('\uD83D\uDC2A')) // false .也比對不到
console.log(/^.$/u.test('\uD83D\uDC2A')) // true
document.body.innerText = '\uD83D\uDC2A'
           
ES13 正則方法、修飾符yus、UTF_16編碼方式修飾符元字元ES6新增部分UTF_16

s 讓.能代表一切

.

不能代表的

\n

\r

U2028(行分隔符) U2029(段分隔符)

console.log(/foo.bar/s.test('foo\nbar')) // true
console.log((/foo.bar/s).dotAll)// true
           

UTF_16

  • Unicode分區定義,ASCII是Unicode的一部分
  • 每個區存放2的16次方個(2位元組,每個位元組8位)U+0000 到 U+FFFF 第一個平面(BMP平面)
  • 整個Unicode分為17個平面
  • 特殊的漢字,2個位元組表示不了時,用4個位元組
  • U+D800 到 U+FFFF沒有對應的字元
    ES13 正則方法、修飾符yus、UTF_16編碼方式修飾符元字元ES6新增部分UTF_16
// 一定要大于D800
document.body.innerText = '\uD842\uDFB7' // 𠮷
document.body.innerText = '\uD866\uDF99' // 𩮙
'瀛'.charCodeAt(0) // 28699
(28699).toString(16) // "701b"
document.body.innerText = '\u701b' // 瀛
           

用碼點顯示emoji

emoji對照表

ES13 正則方法、修飾符yus、UTF_16編碼方式修飾符元字元ES6新增部分UTF_16
ES13 正則方法、修飾符yus、UTF_16編碼方式修飾符元字元ES6新增部分UTF_16
(/\u{1F60D}/u).test('😍') // true
(/a{2}/).test('aa') // true 這裡的{}表示量詞
           

繼續閱讀