Skip to content

Commit

Permalink
update(JS): web/javascript/reference/global_objects/string/replaceall (
Browse files Browse the repository at this point in the history
…#635)

* update(JS): web/javascript/reference/global_objects/string/replaceall

* update(JS): web/javascript/reference/global_objects/string/replaceall
  • Loading branch information
undead404 authored Sep 16, 2022
1 parent ba979d4 commit ce452a2
Showing 1 changed file with 37 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,80 +14,68 @@ browser-compat: javascript.builtins.String.replaceAll

{{JSRef}}

Метод **`replaceAll()`** (замінити все) повертає новий рядок, в якому всі збіги з патерном `pattern` замінені переданим значенням `replacement`. Значенням `pattern` може бути як рядок, так і {{jsxref("RegExp")}}, а `replacement` може бути рядком або функцією, яка буде викликана для кожного знайденого збігу.

Початковий рядок залишається незмінним.
Метод **`replaceAll()`** (замінити все) повертає новий рядок, в якому всі збіги з патерном `pattern` замінені переданим значенням `replacement`. Значенням `pattern` може бути як рядок, так і {{jsxref("RegExp")}}, а `replacement` може бути рядком або функцією, яка буде викликана для кожного знайденого збігу.Початковий рядок залишається незмінним.

{{EmbedInteractiveExample("pages/js/string-replaceall.html")}}

## Синтаксис

```js
replaceAll(regexp, newSubstr);
replaceAll(regexp, replacerFunction);

replaceAll(substr, newSubstr);
replaceAll(substr, replacerFunction);
```js-nolint
replaceAll(pattern, replacement)
```

> **Примітка:** Під час застосування із \`_regexp_\` необхідно встановлювати прапорець глобального пошуку ("g"). Інакше
> функція викине `TypeError`: "replaceAll must be called with a global RegExp".
### Параметри

- `regexp` (pattern)
- : Об'єкт {{jsxref("RegExp", "регулярного виразу")}} або його літеральна форма з прапорцем глобального пошуку. Збіги замінюються вмістом параметра `newSubstr` або значенням, поверненим зі вказаної `replacerFunction`. Регулярний вираз без глобального прапорця ("g") викине `TypeError`: "replaceAll must be called with a global RegExp".
- `substr`
- : {{jsxref("String", "Рядок")}}, який буде замінений вмістом `newSubstr`. Його значення сприймається як рядок і _не_ інтерпретується як регулярний вираз.
- `newSubstr` (заміна)
- : {{jsxref("String", "Рядок")}}, який замінює всі підрядки, вказані через параметр `regexp` чи `substr`. Доступний цілий набір патернів спеціальної заміни; докладніше про це в секції "[Передача рядка як аргументу](#peredacha-riadka-yak-arhumentu)"
нижче.
- `replacerFunction` (заміна)
- : Функція, що буде закликана для створення нового підрядка для заміни збігів із переданим `regexp` чи `substr`.
Аргументи, що передаються цій функції, описані в секції
"[Передача функції як аргументу](#peredacha-funktsii-yak-arhumentu)" нижче.
- `pattern` (патерн)

- : може бути рядком чи об'єктом з методом [`Symbol.replace`](/uk/docs/Web/JavaScript/Reference/Global_Objects/Symbol/replace) – типовим зразком чого є [регулярні вирази](/uk/docs/Web/JavaScript/Reference/Global_Objects/RegExp). Будь-яке значення, котре не має метода `Symbol.replace`, буде зведено до рядка.

Якщо `pattern` [є регулярним виразом](/uk/docs/Web/JavaScript/Reference/Global_Objects/String/includes), то він мусить мати позначку глобальності (`g`), інакше – буде викинуто {{jsxref("TypeError")}}.

- `replacement` (заміна)
- : Може бути рядком чи функцією. Заміна має таку само семантику, як для [`String.prototype.replace()`](/uk/docs/Web/JavaScript/Reference/Global_Objects/String/replace).

### Повернене значення

Новий рядок, в якому всі збіги з патерном замінені вказаним значенням.

## Опис

Цей метод не змінює об'єкт {{jsxref("String")}}, на якому викликається. Натомість він повертає новий рядок.
### Винятки

### Передача рядка як аргументу
- {{jsxref("TypeError")}}
- : Викидається, якщо `pattern` [є регулярним виразом](/uk/docs/Web/JavaScript/Reference/Global_Objects/RegExp#osoblyva-povedinka-rehuliarnykh-vyraziv), котрий не має позначки глобальності (`g`), тобто його властивість [`flags`](/uk/docs/Web/JavaScript/Reference/Global_Objects/RegExp/flags) не містить `"g"`.

Рядок для заміни може містити наступні спеціальні патерни заміни:
## Опис

| Патерн | Що вставляє |
| -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `$$` | Вставляє `"$"`. |
| `$&` | Вставляє підрядок, який збігся з патерном. |
| `` $` `` | Вставляє частину рядка, яка передує знайденому збігу. |
| `$'` | Вставляє частину рядка, яка знаходиться після знайденого збігу. |
| `$n` | Де `n` — додатне ціле число, менше за 100. Вставляє збіг з відповідною групою в дужках, за умови, якщо першим аргументом було передано об'єкт {{jsxref("RegExp", "регулярного виразу")}}. Важлива деталь: нумерація цих груп починається з `1`. |
Цей метод не видозмінює рядкове значення, на котрому його викликали. Він повертає новий рядок.

### Передача функції як аргументу
На відміну від [`replace()`](/uk/docs/Web/JavaScript/Reference/Global_Objects/String/replace), цей метод замінює всі входження рядка, а не тільки перше. Це особливо зручно, коли рядок не є статично відомим, оскільки виклик конструктора [`RegExp()`](/uk/docs/Web/JavaScript/Reference/Global_Objects/RegExp/RegExp) без екранування спеціальних символів може мимоволі змінити його семантику.

Другим аргументом можна також передати функцію. В цьому випадку функція закликається одразу, щойно збіг знайдено. Результат виконання функції (повернене значення) буде використано як рядок заміни. (**Зауваження:** Згадані вище спеціальні патерни для заміни в цьому випадку _не_ застосовуються.)
```js
function unsafeRedactName(text, name) {
return text.replace(new RegExp(name, 'g'), '[ВИДАЛЕНО]');
}
function safeRedactName(text, name) {
return text.replaceAll(name, '[ВИДАЛЕНО]');
}
const report =
"Хакер на ім'я ха.*ер використав спеціальні символи в своєму імені для зламу сервера.";
console.log(unsafeRedactName(report, 'ха.*ер')); // "Хакер на ім'я [ВИДАЛЕНО]а."
console.log(safeRedactName(report, 'ха.*ер')); // "Хакер на ім'я [ВИДАЛЕНО] використав спеціальні символи в своєму імені для зламу сервера."
```

Слід зауважити, що якщо першим аргументом заклику `replaceAll()` передано об'єкт {{jsxref("RegExp", "регулярного виразу")}} або його літеральну форму, то цю функцію буде закликано декілька разів.
Якщо `pattern` є об'єктом з методом [`Symbol.replace`](/uk/docs/Web/JavaScript/Reference/Global_Objects/Symbol/replace) (в т.ч. об'єктом `RegExp`), то такий метод викликається з цільовим рядком та `replacement` як аргументами. Повернене значення стає поверненим значенням `replaceAll()`. У такому випадку логіка `replaceAll()` повністю закодована у методі `@@replace`, а отже – матиме такий само результат, як `replace()` (окрім додаткової валідації введення – перевірки того, що регулярний вираз є глобальним).

Аргументи функції такі:
Якщо `pattern` є порожнім рядком, то заміна буде вставлена між кожними двома кодовими одиницями UTF-16, подібно до поведінки [`split()`](/uk/docs/Web/JavaScript/Reference/Global_Objects/String/split).

| Можливе ім'я | Передане значення |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `match` | Частина рядка, що збігається з патерном. (Відповідає комбінації `$&` вище). |
| `p1, p2, ...` | Рядок, знайдений групою захоплення номер _n_ (включно з іменованими групами захоплення), за умови, що першим аргументом у `replace()` передано {{jsxref("RegExp", "регулярний вираз")}}. (Відповідає комбінаціям `$1`, `$2`, і т.д. вище.) Наприклад, якщо було передано регулярний вираз `/(\a+)(\b+)/`, `p1` — це збіг для групи `\a+`, а `p2` — для `\b+`. |
| `offset` | Зміщення всередині всього початкового рядка, за яким знаходиться частина рядка зі знайденим збігом. (Наприклад, якщо весь рядок був `'abcd'`, а знайдений збіг — `'bc'`, то цей аргумент дорівнюватиме `1`.) |
| `string` | Цілий рядок, в якому проводився пошук збігів. |
| `namedGroups` | Об'єкт з усіма іменованими групами захоплення. Його ключі відповідають іменам груп, а значення - відповідним знайденим збігам. Якщо регулярний вираз не містить ніяких груп захоплення, `namedGroups` дорівнює `undefined` |
```js
'xxx'.replaceAll('', '_'); // "_x_x_x_"
```

(Точна кількість аргументів залежить від того, чи першим аргументом був переданий {{jsxref("RegExp", "регулярний вираз")}}, і кількості вказаних груп в дужках у ньому, якщо так.)
Для отримання подробиць про те, як властивості регулярних виразів (особливо позначку [липкості](/uk/docs/Web/JavaScript/Reference/Global_Objects/RegExp/sticky)) взаємодіють із `replaceAll()` – дивіться [`RegExp.prototype[@@replace]()`](/uk/docs/Web/JavaScript/Reference/Global_Objects/RegExp/@@replace).

## Приклади

### Застосування методу replaceAll
### Застосування методу replaceAll()

```js
'aabbcc'.replaceAll('b', '.');
Expand All @@ -100,7 +88,7 @@ replaceAll(substr, replacerFunction);

```js example-bad
'aabbcc'.replaceAll(/b/, '.');
TypeError: replaceAll must be called with a global RegExp
// TypeError: replaceAll must be called with a global RegExp
```

Проте такий варіант працюватиме:
Expand Down

0 comments on commit ce452a2

Please sign in to comment.