字符串和正則表達式

UTF碼位

Unicode的目標是為全世界每一種字符提供全球唯一的標識符。(這里的唯一標識符又稱為碼位(code point)),是從0開始的數(shù)值。
表示字符的這些數(shù)值或碼位,我們稱之為編碼單元。對于UTF-16來說碼位可以由多種編碼單元表示:

  • 前2^16個碼位均以16位的編碼單元表示,這個范圍被稱為基本多文種平面(BMP, Basic Multilingual Plane)。
  • 超出這個范圍就被稱作某個輔助平面(supplementary plane)。

也就是說字符串里的字符有兩種,一種是由一個編碼單元16位表示的BMP字符,另一種是由兩個編碼單元32位表示的輔助平面字符。

對于輔助平面字符:

  • 其字符的長度length屬性值位2
  • 它被判定為兩個字符,故匹配單一字符串的正則表達式會失效
  • 前后兩個16位編碼單元都不表示可打印字符,因此charAt()方法不會返回合法字符
  • charCodeAt()方法同樣不會正確識別字符,它會返回每一個編碼單元對應的數(shù)值

charPointAt()

這個方法接受編碼單元的位置而非字符位置為參數(shù),返回與字符串中給定位置對應的碼位。

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的標準化形式。這個方法接受一個可選字符串參數(shù),指明應用一下的某一種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()
    三者都返回布爾值。三者都有第二參數(shù)。include,startsWith第二參數(shù)表示從那個位置開始搜索,endsWith表示從length-index位置開始搜索。如果傳入正則表達式則會引發(fā)錯誤,而indexOf和lastIndexOf則不會。

repeat()

其接受一個number類型的參數(shù),表示該字符串重復次數(shù),返回當前字符串重復一定次數(shù)后的新字符串

console.clear();
const text = "Hello";
console.log(text.repeat(3));  //"HelloHelloHello"
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容