Как заменить все вхождения подстроки в строке JavaScript?
Решение: метод 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) — универсальное и надёжное решение.