iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
0
Modern Web

從ES到ESNext - 30天輕鬆掌握ECMAScript系列 第 21

ES2018(ES9) - 正規表達式、其餘運算子

  • 分享至 

  • xImage
  •  

本系列文章經過重新編排和擴充,已出書為ECMAScript關鍵30天。原始文章因當時準備時程緊迫,多少有些許錯誤。為了避免造成讀者的困擾,以及配合書籍的內容規劃,將會陸續更新本系列文章。
本篇文章在 2021/11/2 已更新。

正規表達式

在實務開發,需要處理冗長複雜的字串,對字串進行特定內容的比對、取代、擷取等的時候,很多人選擇的解法會是正規表達式(Regular Expression)。

以白話來解釋正規表達式的話,就是透過一組類似句法的模式(pattern)拿來比對要檢查的字串,找出符合的文字內容。

斷言

斷言指的是目標字串中的某個錨點需要符合特定條件。在ES2018後,釋出了後行(lookbehinds)斷言的符號支援。在這之前,得先了解什麼是先行(lookaheads)斷言

先行(lookaheads)斷言

重點會是放在這個斷言之「後」的文字內容,並且操作上有分正、負向,表示需不需要匹配括號內的句法。

  • x(?=y)

x之後的文字內容,需匹配括號內的句法y。
例子: /re(?=g)/ >>> regular expression => 會匹配到regular的re

  • x(?!y)
    x之後的文字內容,不需匹配括號內的句法y。
    例子: /re(?!g)/ >>> regular expression => 會匹配到expression的re

後行(lookbehinds)斷言

ES2018釋出的後行斷言,重點則是放在這個斷言之「前」的文字內容,並且操作上一樣有分正、負向。

  • (?<=y)x
    x之前的文字內容,需匹配括號內的句法y。
    例子: /(?<=p)re/ >>> regular expression => 會匹配到expression的re

  • (?<!=y)x
    x之前的文字內容,不需匹配括號內的句法y。
    例子:/(?<!=p)re/ >>> regular expression => 匹配到regular的re

命名群組(Named capturing groups)

在句法中,括號裡的最前面加上?<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" }

上一篇
ES2018(ES9) - Promise、for await of
下一篇
ES2019(ES10) - string、symbol、Object、Array
系列文
從ES到ESNext - 30天輕鬆掌握ECMAScript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言