Avatar ·

Как заменить все вхождения подстроки в строке JavaScript?

Всем привет! Я новичок в JavaScript и столкнулся с такой проблемой: мне нужно заменить все вхождения определённого слова или символа в строке. Я пробовал использовать метод replace(), но он заменяет только первое совпадение. Вот пример моего кода: ```javascript let text = "Я люблю JavaScript. JavaScript — это круто!"; let newText = text.replace("JavaScript", "Python"); console.log(newText); // Выводит: "Я люблю Python. JavaScript — это круто!" ``` Как видите, заменилось только первое слово "JavaScript", а второе осталось. Как сделать так, чтобы заменились все вхождения? Я слышал, что можно использовать регулярные выражения, но пока не очень разбираюсь в них. Есть ли более простой способ? Или обязательно нужно изучать RegExp? Буду благодарен за понятное объяснение с примерами. Спасибо! <<>>

Решение: метод replace() с регулярным выражением и флагом g

Вы абсолютно правы — стандартный метод replace() без дополнительных параметров заменяет только первое совпадение. Чтобы заменить все вхождения, нужно использовать регулярное выражение с флагом g (global). Флаг g указывает JavaScript искать все совпадения, а не только первое.

Вот как это работает для вашего примера:

let text = "Я люблю JavaScript. JavaScript — это круто!";
let newText = text.replace(/JavaScript/g, "Python");
console.log(newText); // Выводит: "Я люблю Python. Python — это круто!"

Обратите внимание: мы обернули искомую строку в косые черты /.../ — это синтаксис регулярного выражения. После закрывающего слеша мы добавили флаг g.

Что если строка содержит специальные символы?

Если вам нужно заменить текст, который может содержать точки, скобки, плюсы и другие символы, имеющие особое значение в регулярных выражениях, их нужно экранировать. Например:

let text = "Цена: 10.99$. Скидка: 5.99$.";
// Неправильно: точка означает "любой символ"
let wrong = text.replace(/./g, ""); // Удалит все символы!
// Правильно: экранируем точку
let correct = text.replace(/\./g, ",");
console.log(correct); // "Цена: 10,99$. Скидка: 5,99$."

Простой способ без регулярных выражений (для обычных строк)

Если вы не хотите работать с регулярками, можно использовать комбинацию split() и join():

let text = "Я люблю JavaScript. JavaScript — это круто!";
let newText = text.split("JavaScript").join("Python");
console.log(newText); // "Я люблю Python. Python — это круто!"

Этот метод проще для понимания, но менее производительный для больших строк и не поддерживает сложные шаблоны.

Сравнение методов

  • replace(/pattern/g, replacement) — наиболее правильный и производительный способ. Подходит для любых случаев.
  • split().join() — простой, но не подходит для регулярных выражений. При замене большого количества строк может быть медленнее.
  • replaceAll() — современный метод (ES2021), который работает как replace с глобальным флагом, но без регулярных выражений. Поддерживается в современных браузерах и Node.js 15+.

Пример с replaceAll()

let text = "Я люблю JavaScript. JavaScript — это круто!";
let newText = text.replaceAll("JavaScript", "Python");
console.log(newText); // "Я люблю Python. Python — это круто!"

Но будьте осторожны: replaceAll() не поддерживается в Internet Explorer и старых версиях браузеров. Для максимальной совместимости используйте replace(/pattern/g).

Рекомендация

Освоить регулярные выражения — полезный навык для JavaScript-разработчика. Начните с простых шаблонов: /искомыйТекст/gi (g — глобальный поиск, i — игнорирование регистра). Со временем вы научитесь заменять целые группы символов, числа, пробелы и многое другое.

<<>>

Альтернативный подход: функция-заменитель с replace()

Иногда вам нужно не просто заменить текст, а выполнить какие-то действия при каждой замене. Для этого можно передать в replace() функцию обратного вызова:

let text = "У меня 2 яблока и 3 груши.";
let result = text.replace(/\d+/g, function(match) {
    return parseInt(match) * 2;
});
console.log(result); // "У меня 4 яблока и 6 груши."

Здесь мы нашли все числа (\d+ — одна или более цифр) и удвоили каждое. Функция получает найденное совпадение и возвращает то, на что его нужно заменить.

Замена с учётом регистра

Если нужно заменить и "JavaScript", и "javascript", и "JAVASCRIPT", используйте флаг i (ignore case):

let text = "JavaScript — это JS. javascript тоже JS.";
let result = text.replace(/javascript/gi, "Python");
console.log(result); // "Python — это JS. Python тоже JS."

Когда использовать какой метод?

  • Простая замена текста — replaceAll() (если поддерживается) или split/join
  • Замена с шаблонами (цифры, пробелы, границы слов) — replace(/pattern/g)
  • Динамическая замена с вычислениями — replace(/pattern/g, callback)

Выбирайте подход под свою задачу. Для большинства случаев replace(/pattern/g) — универсальное и надёжное решение.