一、正则表达式: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”的?