字符串和正则表达式

UTF码位

Unicode的目标是为全世界每一种字符提供全球唯一的标识符。(这里的唯一标识符又称为码位(code point)),是从0开始的数值。
表示字符的这些数值或码位,我们称之为编码单元。对于UTF-16来说码位可以由多种编码单元表示:

  • 前2^16个码位均以16位的编码单元表示,这个范围被称为基本多文种平面(BMP, Basic Multilingual Plane)。
  • 超出这个范围就被称作某个辅助平面(supplementary plane)。

也就是说字符串里的字符有两种,一种是由一个编码单元16位表示的BMP字符,另一种是由两个编码单元32位表示的辅助平面字符。

对于辅助平面字符:

  • 其字符的长度length属性值位2
  • 它被判定为两个字符,故匹配单一字符串的正则表达式会失效
  • 前后两个16位编码单元都不表示可打印字符,因此charAt()方法不会返回合法字符
  • charCodeAt()方法同样不会正确识别字符,它会返回每一个编码单元对应的数值

charPointAt()

这个方法接受编码单元的位置而非字符位置为参数,返回与字符串中给定位置对应的码位。

console.clear();
const text = String.fromCodePoint(134071) + "a"; //"𠮷a"

console.log(text.charCodeAt(0));  //55362
console.log(text.charCodeAt(1));  //57271
console.log(text.charCodeAt(2));  //97

console.log(text.codePointAt(0));  //134071
console.log(text.codePointAt(1));  //57271
console.log(text.codePointAt(2));  //97

console.log(text.length); //3

String.fromCodePoint()

该方法可以生成一个字符,相当于完整版的String.fromCharCode()

String.fromCodePoint(134071) ; //"𠮷"

normalize()

它可以提供Unicode的标准化形式。这个方法接受一个可选字符串参数,指明应用一下的某一种Unicode标准化形式:

  • 以标准等价方式分解,然后以标准等价方式重组(“NFC”),默认选项
  • 以标准等价方式分解(”NFD“)
  • 以兼容等价方式分解(”NFKC“)
  • 以兼容等价方式分解,然后以标准等价方式重组(“NFKD”)
    在对字符串比较之前,一定要先把它们标准化为同一形式

正则表达式u修饰符

当一个正则表达式添加了u修饰符,它就从编码单元操作模式切换为字符模式。

console.clear();
const text = String.fromCodePoint(134071); //"𠮷a"

console.log(/^.$/.test(text));   //false
console.log(/^.$/u.test(text));  //true

字符串的字串识别

  • include()
  • startsWith()
  • endsWith()
    三者都返回布尔值。三者都有第二参数。include,startsWith第二参数表示从那个位置开始搜索,endsWith表示从length-index位置开始搜索。如果传入正则表达式则会引发错误,而indexOf和lastIndexOf则不会。

repeat()

其接受一个number类型的参数,表示该字符串重复次数,返回当前字符串重复一定次数后的新字符串

console.clear();
const text = "Hello";
console.log(text.repeat(3));  //"HelloHelloHello"
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容