// amount-unit patternconstamountUnitPattern= /\b(\d+) (\w+)\b/g;// groups: ╰─1─╯ ╰─2─╯conststock="1 lemon, 2 cabbages, and 101 eggs";// matches: ╰─────╯ ╰────────╯ ╰──────╯// minus 1: → no lemon, 1 cabbage, and 100 eggs// replacer function: ╭─G1─╮ ╭G2╮constminus1=stock.replace(amountUnitPattern, (match, amount, unit) => { amount =+amount -1;// only one left, remove the 's'if (amount ===1) unit =unit.slice(0,unit.length-1);if (amount ===0) amount ="no";return amount +" "+ unit;});
因為 str.replace() 會對每個 match 進行指定的 replacer function 操作,所以如果我們只是要對每個 match 做某些動作,但不在乎代換後的文字,即可使用此方法。我們可以把這種做法當作是:str.match().forEach() 的捷徑,但又沒有 str.match().forEach() 的缺點,因為沒有 match 時,str.replace() 頂多就是不進行替換而已,並不會產生錯誤訊息。