RegExp.prototype[Symbol.replace]()
åºçº¿
广æ³å¯ç¨
èª 2020å¹´1æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
RegExp å®ä¾ç [Symbol.replace]() æ¹æ³æå®äº 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")));
// Expected output: "#!@?tball"
è¯æ³
regexp[Symbol.replace](str, replacement)
åæ°
str-
æ£åæ¿æ¢çç®æ å符串ã
newSubStr (replacement)-
ç±»å为
Stringçæ¿æ¢å¨ãæ¯æå¤§å¤æ°ç¹æ®çæ¿æ¢å¹é 模å¼ï¼è§String.prototype.replace()çæå®å符串ä½ä¸ºæ¿æ¢é¡¹é¨åã function (replacement)-
çææ°çåå符串çåè°å½æ°æ¿æ¢å¨ãä½ç¨äºè¯¥å½æ°çåæ°çè¯¦ç»æè¿°è§
String.prototype.replace()çæå®å½æ°ä½ä¸ºæ¿æ¢é¡¹é¨åã
è¿åå¼
ç¨æ¿æ¢å¨æ¿æ¢ç¸åºå¹é 项åçæ°å符串ã
æè¿°
妿å¹é
模å¼ä¹æ¯ RegExp 对象ï¼è¿ä¸ªæ¹æ³å¨ String.prototype.replace() çå
é¨è°ç¨ãä¾å¦ï¼ä¸é¢çä¸¤ä¸ªæ¹æ³è¿åç¸åç»æã
"abc".replace(/a/, "A");
/a/[Symbol.replace]("abc", "A");
è¯¥æ¹æ³æ¯ä¸ºäºå¨ RegExp åç±»ä¸èªå®ä¹å¹é çæ¿æ¢æ¨¡å¼ã
妿å¹é
模å¼ä¸æ¯ä¸ä¸ªRegExp 对象ï¼String.prototype.replace() å°±ä¸ä¼è°ç¨è¯¥æ¹æ³ï¼ä¹ä¸ä¼å建ä¸ä¸ª RegExp对象ã
示ä¾
>ç´æ¥è°ç¨
è¿ä¸ªæ¹æ³åºæ¬å¯ä»¥å String.prototype.replace() 䏿 ·ä½¿ç¨ï¼ä¸åä¹å¤æ¯ this ååæ°é¡ºåºã
var re = /-/g;
var str = "2016-01-01";
var 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| 次ã
var result = str;
for (var i = 0; i < this.count; i++) {
result = RegExp.prototype[Symbol.replace].call(this, result, replacement);
}
return result;
}
}
var re = new MyRegExp("\\d", "", 3);
var str = "01234567";
var newstr = str.replace(re, "#"); // String.prototype.replace è°ç¨ re[Symbol.replace]()ã
console.log(newstr); // ###34567
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-regexp.prototype-%symbol.replace%> |
æµè§å¨å ¼å®¹æ§
åè§
core-jsä¸RegExp.prototype[Symbol.replace]ç polyfillString.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