本系列文章經過重新編排和擴充,已出書為ECMAScript關鍵30天。原始文章因當時準備時程緊迫,多少有些許錯誤。為了避免造成讀者的困擾,以及配合書籍的內容規劃,將會陸續更新本系列文章。
本篇文章在 2021/11/2 已更新。
在實務開發,需要處理冗長複雜的字串,對字串進行特定內容的比對、取代、擷取等的時候,很多人選擇的解法會是正規表達式(Regular Expression)。
以白話來解釋正規表達式的話,就是透過一組類似句法的模式(pattern)拿來比對要檢查的字串,找出符合的文字內容。
斷言指的是目標字串中的某個錨點需要符合特定條件。在ES2018後,釋出了後行(lookbehinds)斷言的符號支援。在這之前,得先了解什麼是先行(lookaheads)斷言。
重點會是放在這個斷言之「後」的文字內容,並且操作上有分正、負向,表示需不需要匹配括號內的句法。
x(?=y)
x之後的文字內容,需匹配括號內的句法y。
例子: /re(?=g)/
>>> regular expression => 會匹配到regular的re
x(?!y)
/re(?!g)/
>>> regular expression => 會匹配到expression的reES2018釋出的後行斷言,重點則是放在這個斷言之「前」的文字內容,並且操作上一樣有分正、負向。
(?<=y)x
x之前的文字內容,需匹配括號內的句法y。
例子: /(?<=p)re/
>>> regular expression => 會匹配到expression的re
(?<!=y)x
x之前的文字內容,不需匹配括號內的句法y。
例子:/(?<!=p)re/
>>> regular expression => 匹配到regular的re
在句法中,括號裡的最前面加上?<name>
,就能為這個群組建立名稱,可以更方便使用這個名稱來取得對應符合的文字內容。
const myRegexp = /Name: (?<fullName>(?<firstName>\w+) (?<lastName>\w+))/;
const result = myRegexp.exec('Name: Yuri Tsai');
console.log(result.groups);
// {fullName: "Yuri Tsai", firstName: "Yuri", lastName: "Tsai"}
在物件上可以搭配解構賦值將剩餘的屬性指派到一個變數。不過要注意的地方是,需要以實際的物件值進行指派。
const obj = { name: "One Punch Man", age: 28, lead: "Saitama", gender: "male" };
const { name, lead, ...oherProps } = obj;
console.log(otherProps); // Uncaught ReferenceError: otherProps is not defined
const { name, lead, ...oherProps } = {
name: "One Punch Man",
age: 28,
lead: "Saitama",
gender: "male",
};
console.log(otherProps); // { age: 28, gender: "male" }