一、正則表達式:y 修飾符 (sticky 粘連)
const s = 'aaa_aa_a'
const r1 = /a+/g // 第一次匹配之後,從剩餘的字符裏匹配
const r2 = /a+/y // y修飾符 sticky 粘連:第一次匹配之後,接下來從緊跟着的字符開始匹配。適合業務場景:連續匹配 一定程度上等同於 ^ $
console.log(r1.exec(s)) // aaa
console.log(r2.exec(s)) // aaa
console.log(r1.exec(s)) // aa
console.log(r2.exec(s)) // null
二、ES5 如何在正則中處理中文問題?如果是多個字節呢?ES6如何實現?
// unicode 國際編碼標準 u 修飾符, "Unicode模式",用來正確處理大於 \uFFFF 的Unicode字符
let s = '𠮷'
// let s2 = '\uD842\uDFB7'
// console.log(/^\uD842/.test(s2)) // true
// console.log(/^\uD842/u.test(s2)) // false
// . 匹配任意字符
// console.log(/^.$/.test(s))
// console.log(/^.$/u.test(s))
// unicode 碼點識別碼點值
// console.log(/\u{20BB7}/u.test(s))
// console.log(/\u{61}/u.test('a'))
// 量詞
// console.log(/𠮷{2}/u.test('𠮷𠮷')) // true
// console.log(/𠮷{2}/.test('𠮷𠮷')) // false
// i 修飾符 忽略大小寫
console.log(/[a-z]/i.test('\u212A')) //false
console.log(/[a-z]/iu.test('\u212A')) //true
// ES6中正則後加u修飾符
延伸閱讀:
1、Unicode 及編碼方式概述
2、Unicode 轉 UTF-16 的轉碼公式
3、New regular expression features in ECMAScript 6
4、sticky
思考:
1、sticky 模式有什麼實際應用場景嗎?
2、上面提到的 \uD83D\uDC2A 是四個字節,加了u標識符會正確識別出是兩個字符,那麼在 JavaScript裏一個字符是幾個字節?
3、U+20BB7 是如何計算出“\uD842\uDFB7”的?