Я пытаюсь заменить несколько слов в строке несколькими другими словами. Строка «У меня есть кошка, собака и коза».
Однако, это не производит «у меня есть собака, коза и кошка», а вместо этого производит «у меня есть кошка, кошка и кошка». Можно ли заменить несколько строк несколькими другими строками одновременно в JavaScript, чтобы получить правильный результат?
var str = "I have a cat, a dog, and a goat.";
str = str.replace(/cat/gi, "dog");
str = str.replace(/dog/gi, "goat");
str = str.replace(/goat/gi, "cat");
//this produces "I have a cat, a cat, and a cat"
//but I wanted to produce the string "I have a dog, a goat, and a cat".
Ответы:
Конкретное решение
Вы можете использовать функцию, чтобы заменить каждую.
пример jsfiddle
Обобщая это
Если вы хотите динамически поддерживать регулярные выражения и просто добавлять будущие обмены на карту, вы можете сделать это
генерировать регулярное выражение. Так что это будет выглядеть так
И чтобы добавить или изменить другие замены, вы можете просто отредактировать карту.
скрипка с динамическим регулярным выражением
Делая его многоразовым
Если вы хотите, чтобы это был общий шаблон, вы можете использовать это в такой функции
Тогда вы можете просто передать str и карту замен, которые вы хотите, функции, и она вернет преобразованную строку.
возиться с функцией
Чтобы гарантировать, что Object.keys работает в старых браузерах, добавьте polyfill, например, из MDN или Es5 .
источник
.
обозначение со всеми такими свойствами. Обозначение в скобках работает с любой строкой.map={'.': ',', ',': '.'}
и regex/\.|,/g
.return mapObj[matched.toLowerCase()];
его,return mapObj[matched];
поскольку я использую регистрозависимые клавишиmapObj
.Object.keys(mapObj).map(key => key.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')).join('|')
. Вдохновлен этим ответомЭто может не соответствовать вашим потребностям в этом случае, но я нашел это полезным способом замены нескольких параметров в строках в качестве общего решения. Он заменит все экземпляры параметров, независимо от того, сколько раз на них ссылаются:
Вы бы вызвали это следующим образом:
источник
Используйте пронумерованные элементы, чтобы избежать замены снова. например
затем
Как это работает: -% \ d + находит числа, следующие за%. Скобки фиксируют номер.
Это число (в виде строки) является вторым параметром лямбда-функции n.
+ N-1 преобразует строку в число, затем 1 вычитается для индексации массива домашних животных.
Число% затем заменяется строкой в индексе массива.
/ G заставляет лямбда-функцию вызываться повторно с каждым числом, которое затем заменяется строкой из массива.
В современном JavaScript: -
источник
Это сработало для меня:
источник
используя Array.prototype.reduce () :
пример
источник
${f}
вместо f накопительное значение?${f}
.replace (new RegExp (Object.keys (s) [ 0], 'g'), s [Object.keys (s) [0]]), предложение1) "На тот случай, если кому-то интересно, почему оригинальное решение постера не работает:
источник
пользовательская обычная функция для определения шаблона для замены и последующего использования функции замены для работы с входной строкой,
источник
RegExp
объекта может решить проблемуvar i = new RegExp('}','g'), j = new RegExp('{','g'), k = data.replace(i,'{').replace(j,'}');
С моим пакетом замены можно сделать следующее:
источник
источник
Вы можете найти и заменить строку, используя разделители.
источник
/ * метод replaceSome для строк принимает столько аргументов, сколько мы хотим, и заменяет все из них последним аргументом, для которого мы указали 2013 CopyRights, сохраненный для: Max Ahmed, это пример:
* /
jsFiddle: http://jsfiddle.net/CPj89/
источник
источник
Я написал этот пакет npm stringinject https://www.npmjs.com/package/stringinject, который позволяет вам сделать следующее
который заменит {0} и {1} элементами массива и вернет следующую строку
или вы можете заменить заполнители на ключи объекта и значения, например:
источник
Для этой цели вы можете использовать https://www.npmjs.com/package/union-replacer . По сути, это
string.replace(regexp, ...)
аналог, который позволяет выполнять несколько замен за один проход, сохраняя при этом полную силуstring.replace(...)
.Раскрытие: я автор. Библиотека была разработана для поддержки более сложных настраиваемых пользователем замен, и она решает все проблемные вопросы, такие как группы захвата, обратные ссылки и замены функций обратного вызова.
Приведенные выше решения достаточно хороши для точной замены строк.
источник
с помощью функции прототипа мы можем легко заменить, передав объект с ключами и значениями и заменяемым текстом
источник
Я немного расширил @BenMcCormicks. Он работал для обычных строк, но не в том случае, если я избежал символов или групповых символов. Вот что я сделал
возвращает "бла-бла-234433 бла-бла"
Таким образом, он будет соответствовать ключу в mapObj, а не совпадающему слову '
источник
Решение с помощью Jquery (сначала включите этот файл): замените несколько строк несколькими другими:
источник
javascript tag added in question, and jquery is a libarary of javascript.
Хммм, что логика отключена, она должна быть наоборот, а также просто на голову - из информации тега javascript: « Если не включен еще один тег для фреймворка / библиотеки, ожидается чистый ответ JavaScript »