iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
自我挑戰組

從0到有學習JavaScript系列 第 18

第三章 型別、值和變數-問題筆記 RegExp match(), g, capturing group

  • 分享至 

  • xImage
  •  

一、RegExp輸出的方式:

  1. 在正規表達式(RegExp)中,pattern常常和 exec() 和test()方法連用。
  2. 在字串(String)中,常常和match(), matchAll(), replace(), replaceAll(), search(), split()連用。

Reference:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions

二、match()的用法的延伸
延續昨日主題,match()的用法。
Return value:

  1. 如果使用match(),回傳一個陣列,其陣列內容是依據「有沒有」使用flag g 。如果沒有匹配結果,回傳null。
  2. 如果沒有使用flag g,只會回傳「第一個」符合匹配的結果(意思是後面還有匹配項目就不會回傳了),然後還要是與capturing groups相關,才會被回傳。回傳結果跟使用RegExp.prototype.exec().一樣。
  • 使用g
const text = "Hello, World! Hello, Universe!";
const pattern = /Hello/g;

const result = text.match(pattern);

console.log(result);           //["Hello","Hello"] 回傳所有匹配

  • 沒有使用g
const text = "Hello, World! Hello, Universe!";
const pattern = /Hello/;

const result = text.match(pattern);

console.log(result);           //["Hello"] 只會回傳符合的第一個匹配

  • 沒有使用g,僅回傳第一個匹配項目,以及回傳capturing group
    \d匹配任何數字(0-9)的正規表達式
    (\d{2}) 是第一個capturing group
    (\d{2})是第二個capturing group
    (\d{4})是第三個capturing group
const text= "Today is 01-12-2023, and tomorrow is 02-12-2023.";
const regex = /(\d{2})-(\d{2})-(\d{4})/;
const result = text.match(regex);
console.log(result);

//["01-12-2023","01","12","2023"]  只回傳第一個匹配結果
// "01" 第一個capturing group,表示天
// "12" 第二個capturing group,表示月
//"2023" 第三個capturing group,表示年

  • 使用g 來避免掉只取第一個匹配結果
//上一題,加上使用g
const text = 'Today is 01-12-2023, and tomorrow is 02-12-2023.';

const regex = /(\d{2})-(\d{2})-(\d{4})/g;
const result = text.match(regex);

console.log(result);        //["01-12-2023","02-12-2023"] 回傳兩種結果

三、對於match()用法的描述:

String.prototype.match() 用法是非常簡單的,其實就是第一個參數使用symbol.match()方法。實際上以RegExp.prototype[@@match]()來實現。

  1. 如果要看字串string是否符合正規表達式,使用 RegExp.prototype.test() 方法。
  2. 如果只是想要知道第一個匹配結果,使用 RegExp.prototype.exec() 。
  3. 如果像要獲取capturing group,並使用flag g,需要使用 RegExp.prototype.exec() 或是String.prototype.matchAll()
  • 找出「所有」匹配結果 g ,並允許大小寫皆可以匹配 i (ignore-case)
const str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
const regexp = /[A-E]/gi;   
const matches = str.match(regexp);

console.log(matches);
// ['A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e']

  • 使用有取名字的capturing group
const paragraph = "The quick brown fox jumps over the lazy dog. It barked.";

const capturingRegex = /(?<animal>fox|cat) jumps over/;
const found = paragraph.match(capturingRegex);
console.log(found.groups); // {animal: "fox"}

  • 用在非正規表達式(non-RegExp)的match()
    如果物件有使用Symbol.match,可以自訂匹配項目,Symbol.match回傳結果等於match回傳結果。
const str = "Hmm, this is interesting.";

str.match({
  [Symbol.match](str) {
    return ["Yes, it's interesting."];
  },
}); // returns ["Yes, it's interesting."]

  • 使用. 符號,代表任何文字、字母、數字、符號都可以匹配,所以有結果可回傳
console.log("123".match("1.3")); // [ "123" ]

Reference
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match#using_match_with_a_non-regexp_implementing_match


上一篇
第三章 型別、值和變數-問題筆記 RegExp match()及跳脫字元
下一篇
第三章 型別、值和變數-問題筆記 Boolean
系列文
從0到有學習JavaScript31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言