RegExp.prototype[Symbol.replace]()
Baseline
åºãå©ç¨å¯è½
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã2020å¹´1æä»¥éããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å©ç¨å¯è½ã§ãã
[Symbol.replace]() 㯠RegExp ã¤ã³ã¹ã¿ã³ã¹ã®ã¡ã½ããã§ãæ£è¦è¡¨ç¾ããã¿ã¼ã³ã¨ãã¦æ¸¡ãããã¨ãã« String.prototype.replace() ããã³String.prototype.replaceAll() ãã©ã®ããã«åä½ããããæå®ãã¾ãã
試ãã¦ã¿ã¾ããã
class RegExp1 extends RegExp {
[Symbol.replace](str) {
return RegExp.prototype[Symbol.replace].call(this, str, "#!@?");
}
}
console.log("football".replace(new RegExp1("foo")));
// äºæ³ãããçµæ: "#!@?tball"
æ§æ
regexp[Symbol.replace](str, replacement)
弿°
str-
ç½®æã®å¯¾è±¡ã¨ãªãæåå (
String) ã§ãã replacement-
æååã¾ãã¯é¢æ°ãåããã¨ãã§ãã¾ãã
- æååã®å ´åã¯ãç¾å¨ã®æ£è¦è¡¨ç¾ã§ä¸è´ããé¨åæååãããã§ç½®ãæãã¾ããç¹æ®ãªç½®æãã¿ã¼ã³ã®æ°å¤ã«å¯¾å¿ãã¦ãã¾ãã
String.prototype.replaceãã¼ã¸ã®ç½®ææååã¨ãã¦ã®æååã®æå®ã®ç¯ãåç §ãã¦ãã ããã - 颿°ã®å ´åã¯ãä¸è´ãããã¨ã«å¼ã³åºãããè¿å¤ãç½®ææååã¨ãã¦ä½¿ç¨ããã¾ãããã®é¢æ°ã«æä¾ããã弿°ã«ã¤ãã¦ã¯ã
String.prototype.replaceãã¼ã¸ã®ç½®ææååã¨ãã¦ã®é¢æ°ã®æå®ã§è¨è¿°ããã¦ãã¾ãã
- æååã®å ´åã¯ãç¾å¨ã®æ£è¦è¡¨ç¾ã§ä¸è´ããé¨åæååãããã§ç½®ãæãã¾ããç¹æ®ãªç½®æãã¿ã¼ã³ã®æ°å¤ã«å¯¾å¿ãã¦ãã¾ãã
è¿å¤
ä¸é¨ã¾ãã¯ãã¹ã¦ã®ãã¿ã¼ã³ã®ä¸è´ç®æãç½®æå 容ã«ãã£ã¦ç½®ãæããããæ°ããæååã§ãã
解説
ãã®ã¡ã½ãã㯠String.prototype.replace() ã®ä¸ã§ã pattern 弿°ã RegExp ãªãã¸ã§ã¯ãã§ãã£ãå ´åã«å
é¨çã«å¼ã³åºããã¾ãããã¨ãã°ã次㮠2 ã¤ã®ä¾ã¯åãçµæãè¿ãã¾ãã
"abc".replace(/a/, "A");
/a/[Symbol.replace]("abc", "A");
æ£è¦è¡¨ç¾ãã°ãã¼ãã«ï¼g ãã©ã°ä»ãï¼ã§ããå ´åãæ£è¦è¡¨ç¾ã® exec() ã¡ã½ãã㯠exec() ã null ãè¿ãã¾ã§ç¹°ãè¿ãå¼ã³åºããã¾ããããã§ãªãå ´åãexec() ã¯ä¸åº¦ã ãå¼ã³åºããã¾ããããããã® exec() ã®çµæã«å¯¾ãã¦ã String.prototype.replace() ã®è§£èª¬ã«åºã¥ãã¦ç½®ãæããæºåããã¾ãã
[Symbol.replace]() 㯠exec() ã null ãè¿ãã¾ã§å¼ã³ç¶ããæå¾ã®ç
§åã«å¤±æããã¨èªåçã«æ£è¦è¡¨ç¾ã® lastIndex ã 0 ã«ãªã»ããããã®ã§ã[Symbol.replace]() ãçµäºãã¦ãé常ã¯å¯ä½ç¨ãããã¾ãããããããæ£è¦è¡¨ç¾ãç²ççãã¤ã°ãã¼ãã«ã§ã¯ãªãå ´åãlastIndex ã¯ãªã»ããããã¾ããããã®å ´åãreplace() ãå¼ã³åºããã³ã«ç°ãªãçµæãè¿ãå¯è½æ§ãããã¾ãã
const re = /a/y;
for (let i = 0; i < 5; i++) {
console.log("aaa".replace(re, "b"), re.lastIndex);
}
// baa 1
// aba 2
// aab 3
// aaa 0
// baa 1
æ£è¦è¡¨ç¾ãç²ççã§ã°ãã¼ãã«ãªå ´åãç²ççã«ç
§åãã¾ããããªãã¡ã lastIndex 以éã®åºç¾ã«ã¯ä¸è´ãã¾ããã
console.log("aa-a".replace(/a/gy, "b")); // "bb-a"
ããç¾å¨ã®ä¸è´ã空æååã§ãã£ãã¨ãã¦ãã lastIndex ã¯é²ã¿ã¾ããæ£è¦è¡¨ç¾ã Unicode 対å¿ã§ããã°ãUnicode ã³ã¼ããã¤ã³ãã 1 ã¤é²ã¿ã¾ããããã§ãªãå ´åã¯ã UTF-16 ã³ã¼ãåä½ 1 ã¤åé²ã¿ã¾ãã
console.log("ð".replace(/(?:)/g, " ")); // " \ud83d \ude04 "
console.log("ð".replace(/(?:)/gu, " ")); // " ð "
ãã®ã¡ã½ããã¯ã RegExp ãµãã¯ã©ã¹ã®ç½®æåä½ãã«ã¹ã¿ãã¤ãºããããã«åå¨ãã¦ãã¾ãã
ä¾
>ç´æ¥å¼åºã
this ã¨å¼æ°ã®é åºãç°ãªãç¹ãé¤ãã¦ããã®ã¡ã½ãã㯠String.prototype.replace() ã¨ã»ã¨ãã©åãä½¿ãæ¹ãã§ãã¾ãã
const re = /-/g;
const str = "2016-01-01";
const newStr = re[Symbol.replace](str, ".");
console.log(newStr); // 2016.01.01
ãµãã¯ã©ã¹ã§ã® [Symbol.replace]() ã®ä½¿ç¨
æ¢å®ã®åä½ãä¿®æ£ããããã«ãRegExp ã®ãµãã¯ã©ã¹ã§ [Symbol.replace]() ã¡ã½ããããªã¼ãã¼ã©ã¤ãã§ãã¾ãã
class MyRegExp extends RegExp {
constructor(pattern, flags, count) {
super(pattern, flags);
this.count = count;
}
[Symbol.replace](str, replacement) {
// [Symbol.replace]() ã `count` åå®è¡ãã
let result = str;
for (let i = 0; i < this.count; i++) {
result = RegExp.prototype[Symbol.replace].call(this, result, replacement);
}
return result;
}
}
const re = new MyRegExp("\\d", "", 3);
const str = "01234567";
const newStr = str.replace(re, "#"); // String.prototype.replace 㯠re[Symbol.replace]() ãå¼ã³åºã
console.log(newStr); // ###34567
仿§æ¸
| 仿§æ¸ |
|---|
| ECMAScript® 2027 Language Specification > # sec-regexp.prototype-%symbol.replace% > |
ãã©ã¦ã¶ã¼ã®äºææ§
é¢é£æ å ±
RegExp.prototype[Symbol.replace]ã®ããªãã£ã« (core-js)String.prototype.replace()String.prototype.replaceAll()RegExp.prototype[Symbol.match]()RegExp.prototype[Symbol.matchAll]()RegExp.prototype[Symbol.search]()RegExp.prototype[Symbol.split]()RegExp.prototype.exec()RegExp.prototype.test()Symbol.replace