您现在的位置:首页 >> 前端 >> 内容

html开发中u修饰符使用技巧

时间:2018/1/20 13:51:54 点击:

  核心提示:u 修饰符ES6 对正则表达式添加了u修饰符,含义为Unicode 模式,用来正确处理大于\uFFFF的 Unicode 字符。也就是说,会正确处理四个字节的 UTF-16 编码。/^\uD83D/u...

u 修饰符

ES6 对正则表达式添加了u修饰符,含义为“Unicode 模式”,用来正确处理大于\uFFFF的 Unicode 字符。也就是说,会正确处理四个字节的 UTF-16 编码。


  1. /^\uD83D/u.test('\uD83D\uDC2A') // false
  2. /^\uD83D/.test('\uD83D\uDC2A') // true

上面代码中,\uD83D\uDC2A是一个四个字节的 UTF-16 编码,代表一个字符。但是,ES5 不支持四个字节的 UTF-16 编码,会将其识别为两个字符,导致第二行代码结果为true。加了u修饰符以后,ES6 就会识别其为一个字符,所以第一行代码结果为false。

一旦加上u修饰符号,就会修改下面这些正则表达式的行为。

(1)点字符

点(.)字符在正则表达式中,含义是除了换行符以外的任意单个字符。对于码点大于0xFFFF的 Unicode 字符,点字符不能识别,必须加上u修饰符。


  1. var s = '?';
  2.  
  3. /^.$/.test(s) // false
  4. /^.$/u.test(s) // true

上面代码表示,如果不添加u修饰符,正则表达式就会认为字符串为两个字符,从而匹配失败。

(2)Unicode 字符表示法

ES6 新增了使用大括号表示 Unicode 字符,这种表示法在正则表达式中必须加上u修饰符,才能识别当中的大括号,否则会被解读为量词。


  1. /\u{61}/.test('a') // false
  2. /\u{61}/u.test('a') // true
  3. /\u{20BB7}/u.test('?') // true

上面代码表示,如果不加u修饰符,正则表达式无法识别\u{61}这种表示法,只会认为这匹配 61 个连续的u。

(3)量词

使用u修饰符后,所有量词都会正确识别码点大于0xFFFF的 Unicode 字符。


  1. /a{2}/.test('aa') // true
  2. /a{2}/u.test('aa') // true
  3. /?{2}/.test('??') // false
  4. /?{2}/u.test('??') // true

(4)预定义模式

u修饰符也影响到预定义模式,能否正确识别码点大于0xFFFF的 Unicode 字符。


  1. /^\S$/.test('?') // false
  2. /^\S$/u.test('?') // true

上面代码的\S是预定义模式,匹配所有不是空格的字符。只有加了u修饰符,它才能正确匹配码点大于0xFFFF的 Unicode 字符。

利用这一点,可以写出一个正确返回字符串长度的函数。


  1. function codePointLength(text) {
  2. var result = text.match(/[\s\S]/gu);
  3. return result ? result.length : 0;
  4. }
  5.  
  6. var s = '??';
  7.  
  8. s.length // 4
  9. codePointLength(s) // 2

(5)i 修饰符

有些 Unicode 字符的编码不同,但是字型很相近,比如,\u004B与\u212A都是大写的K。


  1. /[a-z]/i.test('\u212A') // false
  2. /[a-z]/iu.test('\u212A') // true

上面代码中,不加u修饰符,就无法识别非规范的K字符。

Tags:HT TM ML L开 
作者:网络 来源:Web先生的博客