--- title: 'RegExp.prototype[@@replace]()' slug: Web/JavaScript/Reference/Global_Objects/RegExp/@@replace tags: - JavaScript - Method - Prototype - Reference - RegExp - Regular Expression translation_of: Web/JavaScript/Reference/Global_Objects/RegExp/@@replace ---
[@@replace]()
メソッドは文字列内の this
パターンの一部または、すべての一致箇所を replacement
で置き換え、置換結果を新しい文字列として返します。 replacement
は文字列にするか、関数にしてすべての一致箇所ごとに呼び出されるようにすることができます。
regexp[Symbol.replace](str, newSubStr|function)
str
newSubStr
(置換内容)function
(置換内容)一部またはすべてのパターンの一致箇所が置換内容によって置き換えられた新しい文字列です。
このメソッドは {{jsxref("String.prototype.replace()")}} の中で、 pattern
引数が {{jsxref("RegExp")}} オブジェクトであった場合に内部的に呼び出されます。たとえば、次の 2 つの例は同じ結果を返します。
'abc'.replace(/a/, 'A'); /a/[Symbol.replace]('abc', 'A');
このメソッドは、 RegExp
サブクラスの置換動作をカスタマイズするために存在しています。
{{jsxref("String.prototype.replace()")}} は pattern
引数が {{jsxref("RegExp")}} オブジェクトではない場合、このメソッドの呼び出しや {{jsxref("RegExp")}} オブジェクトの生成を行いません。
this
と引数の順序が異なる点を除いて、このメソッドは {{jsxref("String.prototype.replace()")}} とほどんど同じ使い方ができます。
var re = /-/g; var str = '2016-01-01'; var newstr = re[Symbol.replace](str, '.'); console.log(newstr); // 2016.01.01
既定の動作を修正するために、{{jsxref("RegExp")}} のサブクラスで [@@replace]()
メソッドをオーバーライドできます。
class MyRegExp extends RegExp { constructor(pattern, flags, count) { super(pattern, flags); this.count = count; } [Symbol.replace](str, replacement) { // Perform @@replace |count| times. 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 calls re[@@replace]. console.log(newstr); // ###34567
仕様書 |
---|
{{SpecName('ESDraft', '#sec-regexp.prototype-@@replace', 'RegExp.prototype[@@replace]')}} |
{{Compat("javascript.builtins.RegExp.@@replace")}}