aboutsummaryrefslogtreecommitdiff
path: root/files/ru/web/javascript/reference/global_objects/string/replace/index.html
blob: 45df3c1cbfd154a533977e32414b2b8893b8cce3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
---
title: String.prototype.replace()
slug: Web/JavaScript/Reference/Global_Objects/String/replace
tags:
  - JavaScript
  - Method
  - Prototype
  - Reference
  - Référence(2)
  - String
  - регулярные выражения
translation_of: Web/JavaScript/Reference/Global_Objects/String/replace
---
<div>{{JSRef("Global_Objects", "String")}}</div>

<h2 id="Summary">Сводка</h2>

<p>Метод <strong><code>replace()</code></strong> возвращает новую строку с некоторыми или всеми сопоставлениями с шаблоном, заменёнными на заменитель. Шаблон может быть строкой или {{jsxref("Global_Objects/RegExp", "регулярным выражением", "", 1)}}, а заменитель может быть строкой или функцией, вызываемой при каждом сопоставлении.</p>

<h2 id="Syntax">Синтаксис</h2>

<pre class="syntaxbox"><code><var>str</var>.replace(<var>regexp</var>|<var>substr</var>, <var>newSubStr</var>|<var>function</var>[, <var>flags</var>])</code></pre>

<h3 id="Parameters">Параметры</h3>

<dl>
 <dt><code>regexp</code></dt>
 <dd>Объект регулярного выражения {{jsxref("Global_Objects/RegExp", "RegExp")}}. Сопоставление заменяется возвращаемым значением второго параметра.</dd>
 <dt><code>substr</code></dt>
 <dd>{{jsxref("Global_Objects/String", "Строка", "", 1)}}, заменяемая на <code>newSubStr</code>. Обратите внимание, будет заменено только первое вхождение искомой строки.</dd>
 <dt><code>newSubStr</code></dt>
 <dd>{{jsxref("Global_Objects/String", "Строка", "", 1)}}, заменяющая подстроку из первого параметра. Поддерживает несколько специальных шаблонов замены; смотрите ниже раздел <a href="#Specifying_a_string_as_a_parameter">Передача строки в качестве второго параметра</a>.</dd>
 <dt><code>function</code></dt>
 <dd>Функция, вызываемая для создания новой подстроки (помещаемой вместо подстроки из первого параметра). Аргументы, передаваемые функции, описаны ниже в разделе <a href="#Specifying_a_function_as_a_parameter">Передача функции в качестве второго параметра</a>.</dd>
 <dt><code>flags</code> {{non-standard_inline}}</dt>
 <dd>
 <p><strong>Обратите внимание: аргумент <code>flags</code> не работает в ядре v8 (движок JavaScript в Chrome и NodeJs).</strong> Строка, задающая комбинацию <a href="/ru/docs/Web/JavaScript/Guide/Regular_Expressions#Advanced_Searching_With_Flags">флагов регулярного выражения</a>. Параметр <code>flags</code> в методе <code>String.prototype.replace()</code> является нестандартным расширением. Вместо использования этого параметра используйте объект {{jsxref("Global_Objects/RegExp", "RegExp")}} с соответствующими флагами. Значение этого параметра, если он используется, должно быть строкой, состоящей из одного или более следующих символов, следующим образом влияющих на обработку регулярного выражения:</p>

 <dl>
  <dt><code>g</code></dt>
  <dd>глобальное сопоставление</dd>
  <dt><code>i</code></dt>
  <dd>игнорировать регистр</dd>
  <dt><code>m</code></dt>
  <dd>сопоставление по нескольким строкам</dd>
  <dt><code>y</code> {{experimental_inline}}</dt>
  <dd>«липкий» поиск, сопоставление начинается с текущей позиции в строке</dd>
 </dl>
 </dd>
</dl>

<h3 id="Returns">Возвращаемое значение</h3>

<p>Новая строка с некоторыми или всеми сопоставлениями шаблона, заменёнными на заменитель.</p>

<h2 id="Description">Описание</h2>

<p>Этот метод не изменяет объект {{jsxref("Global_Objects/String", "String")}}, на котором он вызывается. Он просто возвращает новую строку.</p>

<p>Для выполнения глобального поиска и замены либо включите флаг <code>g</code> в регулярное выражение, либо, если первый параметр является строкой, включите флаг <code>g</code> в параметр <code>flags</code>.</p>

<h3 id="Specifying_a_string_as_a_parameter">Передача строки в качестве второго параметра</h3>

<p>строка замены может включать следующие специальные шаблоны замены:</p>

<table class="fullwidth-table">
 <tbody>
  <tr>
   <td class="header">Шаблон</td>
   <td class="header">Замена</td>
  </tr>
  <tr>
   <td><code>$$</code></td>
   <td>Вставляет символ доллара «$».</td>
  </tr>
  <tr>
   <td><code>$&amp;</code></td>
   <td>Вставляет сопоставившуюся подстроку.</td>
  </tr>
  <tr>
   <td><code>$`</code></td>
   <td>Вставляет часть строки, предшествующую сопоставившейся подстроке.</td>
  </tr>
  <tr>
   <td><code>$'</code></td>
   <td>Вставляет часть строки, следующую за сопоставившейся подстрокой.</td>
  </tr>
  <tr>
   <td><code>$<em>n</em></code> или <code>$<em>nn</em></code></td>
   <td>Символы <code><em>n</em></code> или <code><em>nn</em></code> являются десятичными цифрами, вставляет <em>n</em>-ную сопоставившуюся подгруппу из объекта {{jsxref("Global_Objects/RegExp", "RegExp")}} в первом параметре.</td>
  </tr>
 </tbody>
</table>

<h3 id="Specifying_a_function_as_a_parameter">Передача функции в качестве второго параметра</h3>

<p>В качестве второго параметра вы можете передать функцию. В этом случае функция будет выполнена после произошедшего сопоставления. Результат вызова функции (её возвращаемое значение) будет использоваться в качестве строки замены (обратите внимание: описанные выше специальные шаблоны замены в этом случае <em>не</em> применяются). Обратите внимание, что функция будет вызвана несколько раз для каждого полного сопоставления, если регулярное выражение в первом параметре является глобальным.</p>

<p>Функция принимает следующие аргументы:</p>

<table class="fullwidth-table">
 <tbody>
  <tr>
   <td class="header">Возможное имя</td>
   <td class="header">Получаемое значение</td>
  </tr>
  <tr>
   <td><code>match</code></td>
   <td>Сопоставившаяся подстрока (соответствует шаблону замены <code>$&amp;</code>, описанному выше).</td>
  </tr>
  <tr>
   <td><code>p1, p2, ...</code></td>
   <td><em>n</em>-ная сопоставившаяся подгруппа из объекта {{jsxref("Global_Objects/RegExp", "RegExp")}} в первом параметре метода <code>replace()</code> (соответствует шаблонам замены <code>$1</code>, <code>$2</code> и так далее, описанным выше). Например, если в качестве шаблона передано регулярное выражение <code>/(\a+)(\b+)/</code>, параметр <code>p1</code> будет значение сопоставления с подгруппой <code>\a+</code>, а параметр <code>p2</code> — с подгруппой <code>\b+</code>.</td>
  </tr>
  <tr>
   <td><code>offset</code></td>
   <td>Смещение сопоставившейся подстроки внутри всей рассматриваемой строки (например, если вся строка равна <code>'abcd'</code>, а сопоставившаяся подстрока равна <code>'bc'</code>, то этот аргумент будет равен 1).</td>
  </tr>
  <tr>
   <td><code>string</code></td>
   <td>Вся рассматриваемая строка.</td>
  </tr>
 </tbody>
</table>

<p>Точное число аргументов будет зависеть от того, был ли первым аргументом объект {{jsxref("Global_Objects/RegExp", "RegExp")}} и, если был, сколько подгрупп в нём определено.</p>

<p>Следующий пример установит переменную <code>newString</code> в значение <code>'abc - 12345 - #$*%'</code>:</p>

<pre class="brush: js">function replacer(match, p1, p2, p3, offset, string) {
  // p1 - не цифры, p2 - цифры, p3 - не буквы и не цифры
  return [p1, p2, p3].join(' - ');
}
var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer);
</pre>

<h2 id="Examples">Примеры</h2>

<h3 id="Example_Using_global_and_ignore_with_replace">Пример: использование флагов <code>global</code> и <code>ignore</code> с методом <code>replace()</code></h3>

<p>В следующем примере регулярное выражение включает флаги для глобального поиска и игнорирования регистра, которые позволяют методу <code>replace()</code> заменить все вхождения слова «яблоки» в строке на слово «апельсины».</p>

<pre class="brush: js">var re = /яблоки/gi;
var str = 'Яблоки круглые и яблоки сочные.';
var newstr = str.replace(re, 'апельсины');
console.log(newstr); // апельсины круглые и апельсины сочные.
</pre>

<h3 id="Example_Defining_the_regular_expression_in_replace">Пример: передача регулярного выражения в метод <code>replace()</code></h3>

<p>В следующем примере в метод <code>replace()</code> передаётся регулярное выражение вместе с флагом игнорирования регистра.</p>

<pre class="brush: js">// Ночь перед Рождеством, Xmas - сокращение для Christmas
var str = 'Twas the night before Xmas...';
var newstr = str.replace(/xmas/i, 'Christmas');
console.log(newstr); // Twas the night before Christmas...
</pre>

<p>Пример выведет строку 'Twas the night before Christmas...'</p>

<h3 id="Example_Switching_words_in_a_string">Пример: смена местами слов в строке</h3>

<p>Следующий скрипт меняет местами слова в строке. В качестве текста замены он использует шаблоны замены <code>$1</code> и <code>$2</code>.</p>

<pre class="brush: js">var re = /([А-ЯЁа-яё]+)\s([А-ЯЁа-яё]+)/;
var str = 'Джон Смит';
var newstr = str.replace(re, '$2, $1');
console.log(newstr); // Смит, Джон
</pre>

<p>Пример выведет строку 'Смит, Джон'.</p>

<h3 id="Example_Using_an_inline_function_that_modifies_the_matched_characters">Пример: использование функции для изменения сопоставившихся символов</h3>

<p>В этом примере все входящие в строку (латинские) буквы в верхнем регистре преобразуются в нижний регистр, а перед самой буквой вставляется дефис. Здесь важно то, что прежде чем элемент вставится в качестве замены, над ним нужно провести дополнительные преобразования.</p>

<p>Функция замены своим параметром принимает сопоставившийся кусок и перед возвратом использует его для преобразования регистра и соединения с дефисом.</p>

<pre class="brush: js">function styleHyphenFormat(propertyName) {
  function upperToHyphenLower(match) {
    return '-' + match.toLowerCase();
  }
  return propertyName.replace(/[A-Z]/g, upperToHyphenLower);
}
</pre>

<p>Вызов <code>styleHyphenFormat('borderTop')</code> вернёт строку 'border-top'.</p>

<p>Поскольку мы хотим провести дополнительные преобразования <em>результата</em> сопоставления до того, как будет использована окончательная подстановка, мы должны использовать функцию. Это заставляет нас принудительно вычислить сопоставление перед использование метода {{jsxref("String.prototype.toLowerCase()", "toLowerCase()")}}. Если бы мы попытались использовать сопоставление без функции, метод {{jsxref("String.prototype.toLowerCase()", "toLowerCase()")}} не сработал бы.</p>

<pre class="brush: js">var newString = propertyName.replace(/[A-Z]/g, '-' + '$&amp;'.toLowerCase());  // не работает
</pre>

<p>Происходит это потому, что сначала часть <code>'$&amp;'.toLowerCase()</code> вычисляется в строковый литерал (результат по-прежнему равен <code>'$&amp;'</code>), а только потом его символы используются в качестве шаблона.</p>

<h3 id="Example_Replacing_a_Fahrenheit_degree_with_its_Celsius_equivalent">Пример: замена градусов по Фаренгейту на эквивалент в градусах по Цельсию</h3>

<p>В следующем примере градусы по Фаренгейту заменяются на эквивалентные градусы по Цельсию. Градусы по Фаренгейту должны быть числом, оканчивающимся на букву F. Функция возвращает количество градусов по Цельсию, оканчивающиеся на букву C. Например, если входное число равняется 212F, функция вернёт 100C. Если число равняется 0F, функция вернёт -17.77777777777778C.</p>

<p>Регулярное выражение <code>test</code> сопоставляется с любым числом, оканчивающимся на букву F. Количество градусов по Фаренгейту передаётся в функцию через её второй параметр, <code>p1</code>. Функция переводит градусы по Фаренгейту, переданные в виде строки в функцию code&gt;f2c(), в градусы по Цельсию. Затем функция <code>f2c()</code> возвращает количество градусов по Цельсию. Эта функция работает примерно так же, как и флаг <code>s///e</code> в Perl.</p>

<pre class="brush: js">function f2c(x) {
  function convert(str, p1, offset, s) {
    return ((p1 - 32) * 5/9) + 'C';
  }
  var s = String(x);
  var test = /(\d+(?:\.\d*)?)F\b/g;
  return s.replace(test, convert);
}
</pre>

<h3 id="Example_Use_an_inline_function_with_a_regular_expression_to_avoid_for_loops">Пример: использование функции вместе с регулярным выражением для избавления от цикла <code>for</code></h3>

<p>Следующий пример принимает строку шаблона и преобразует её в массив объектов.</p>

<p><strong>Входные данные:</strong></p>

<p>Строка, состоящая из символов <code>x</code>, <code>-</code> и <code>_</code></p>

<pre>x-x_
x---x---x---x---
x-xxx-xx-x-
x_x_x___x___x___
</pre>

<p><strong>Выходные данные:</strong></p>

<p>Массив объектов. Символ <code>'x'</code> означает состояние <code>'on'</code>, символ <code>'-'</code> (дефис) означает состояние <code>'off'</code>, а символ <code>'_'</code> (нижнее подчёркивание) означает продолжительность состояния <code>'on'</code>.</p>

<pre class="brush: json">[
  { on: true, length: 1 },
  { on: false, length: 1 },
  { on: true, length: 2 }
  ...
]
</pre>

<p><strong>Код:</strong></p>

<pre class="brush: js">var str = 'x-x_';
var retArr = [];
str.replace(/(x_*)|(-)/g, function(match, p1, p2) {
  if (p1) { retArr.push({ on: true, length: p1.length }); }
  if (p2) { retArr.push({ on: false, length: 1 }); }
});

console.log(retArr);
</pre>

<p>Этот код сгенерирует массив из трёх объектов в описанном формате без использования цикла <code>for</code>.</p>

<h2 id="Specifications">Спецификации</h2>

{{Specifications}}

<h2 id="Browser_compatibility">Совместимость с браузерами</h2>

<div>{{Compat("javascript.builtins.String.replace")}}</div>

<h2 id="See_also">Смотрите также</h2>

<ul>
 <li>{{jsxref("String.prototype.match()")}}</li>
 <li>{{jsxref("RegExp.prototype.exec()")}}</li>
 <li>{{jsxref("RegExp.prototype.test()")}}</li>
</ul>