Замените несколько строк несколькими другими строками
Я пытаюсь заменить несколько слов в строку с несколькими другими словами. Строка: "у меня есть кошка, собака и коза."
однако это не производит "у меня есть собака, коза и кошка", но вместо этого он производит "у меня есть кошка, Кошка и кошка". Можно ли заменить несколько строк несколькими другими строками одновременно в 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".
12 ответов:
Конкретного Решения
вы можете использовать функцию для замены каждого из них.
var str = "I have a cat, a dog, and a goat."; var mapObj = { cat:"dog", dog:"goat", goat:"cat" }; str = str.replace(/cat|dog|goat/gi, function(matched){ return mapObj[matched]; });обобщить это
если вы хотите динамически поддерживать регулярное выражение и просто добавлять будущие обмены на карту, вы можете сделать это
new RegExp(Object.keys(mapObj).join("|"),"gi");для создания регулярных выражений. Тогда это будет выглядеть так
var mapObj = {cat:"dog",dog:"goat",goat:"cat"}; var re = new RegExp(Object.keys(mapObj).join("|"),"gi"); str = str.replace(re, function(matched){ return mapObj[matched]; });и чтобы добавить или изменить любые другие замены, вы можете просто отредактировать карта.
возиться с динамическим регулярным выражением
что делает его многоразовым
если вы хотите, чтобы это был общий шаблон, вы можете вытащить его в такую функцию
function replaceAll(str,mapObj){ var re = new RegExp(Object.keys(mapObj).join("|"),"gi"); return str.replace(re, function(matched){ return mapObj[matched.toLowerCase()]; }); }таким образом, вы можете просто передать str и карту замен, которые вы хотите для функции, и она вернет преобразованную строку.
для обеспечения объекта.ключи работает в старых браузерах, добавить полифилл, например, из MDN или Es5.
Это может не соответствовать вашей точной потребности в этом случае, но я нашел этот полезный способ заменить несколько параметров в строках, как общее решение. Он заменит все экземпляры параметров, независимо от того, сколько раз на них ссылки:
String.prototype.fmt = function (hash) { var string = this, key; for (key in hash) string = string.replace(new RegExp('\{' + key + '\}', 'gm'), hash[key]); return string }вы могли бы вызвать его следующим образом:
var person = '{title} {first} {last}'.fmt({ title: 'Agent', first: 'Jack', last: 'Bauer' }); // person = 'Agent Jack Bauer'
это сработало для меня:
String.prototype.replaceAll = function(search, replacement) { var target = this; return target.replace(new RegExp(search, 'g'), replacement); }; function replaceAll(str, map){ for(key in map){ str = str.replaceAll(key, map[key]); } return str; } //testing... var str = "bat, ball, cat"; var map = { 'bat' : 'foo', 'ball' : 'boo', 'cat' : 'bar' }; var new = replaceAll(str, map); //result: "foo, boo, bar"
пользовательская регулярная функция для определения шаблона для замены, а затем использовать функцию замены для работы с входной строкой,
var i = new RegExp('"{','g'), j = new RegExp('}"','g'), k = data.replace(i,'{').replace(j,'}');
String.prototype.replaceSome = function() { var replaceWith = Array.prototype.pop.apply(arguments), i = 0, r = this, l = arguments.length; for (;i<l;i++) { r = r.replace(arguments[i],replaceWith); } return r; }/* способ replaceSome для струнных он принимает столько аргументов, сколько мы хотим и заменяет все с последним аргументом мы указали 2013 авторские права сохранены для: Макс Ахмед вот пример:
var string = "[hello i want to 'replace x' with eat]"; var replaced = string.replaceSome("]","[","'replace x' with",""); document.write(string + "<br>" + replaced); // returns hello i want to eat (without brackets)*/
jsFiddle: http://jsfiddle.net/CPj89/
<!DOCTYPE html> <html> <body> <p id="demo">Mr Blue has a blue house and a blue car.</p> <button onclick="myFunction()">Try it</button> <script> function myFunction() { var str = document.getElementById("demo").innerHTML; var res = str.replace(/\n| |car/gi, function myFunction(x){ if(x=='\n'){return x='<br>';} if(x==' '){return x=' ';} if(x=='car'){return x='BMW'} else{return x;}//must need }); document.getElementById("demo").innerHTML = res; } </script> </body> </html>
на всякий случай, если кому-то интересно, почему решение оригинального плаката не работает:
var str = "I have a cat, a dog, and a goat."; str = str.replace(/cat/gi, "dog"); // now str = "I have a dog, a dog, and a goat." str = str.replace(/dog/gi, "goat"); // now str = "I have a goat, a goat, and a goat." str = str.replace(/goat/gi, "cat"); // now str = "I have a cat, a cat, and a cat."
Я написал этот пакет npm stringinject https://www.npmjs.com/package/stringinject что позволяет вам сделать следующее
var string = stringInject("this is a {0} string for {1}", ["test", "stringInject"]);который заменит {0} и {1} элементами массива и вернет следующую строку
"this is a test string for stringInject"или вы можете заменить заполнители с помощью ключей объектов и значений, таких как:
var str = stringInject("My username is {username} on {platform}", { username: "tjcafferkey", platform: "GitHub" }); "My username is tjcafferkey on Github"
мой заменить-раз пакет, вы можете сделать следующее:
const replaceOnce = require('replace-once') var str = 'I have a cat, a dog, and a goat.' var find = ['cat', 'dog', 'goat'] var replace = ['dog', 'goat', 'cat'] replaceOnce(str, find, replace, 'gi') //=> 'I have a dog, a goat, and a cat.'
используйте пронумерованные элементы, чтобы предотвратить повторную замену. например,
let str = "I have a %1, a %2, and a %3"; let pets = ["dog","cat", "goat"];затем
str.replace(/%(\d+)/g, (_, n) => pets[+n-1])как это работает:- %\d+ находит числа, которые идут после %. Скобки фиксируют число.
Это число (в виде строки) является 2-м параметром, n, для лямбда-функции.
+n-1 преобразует строку в число, затем 1 вычитается для индексирования массива домашних животных.
число %затем заменяется строкой в массиве индекс.
/g заставляет лямбда-функцию вызываться повторно с каждым числом, которое затем заменяется строкой из массива.
в современном JavaScript: -
replace_n=(str,...ns)=>str.replace(/%(\d+)/g,(_,n)=>ns[n-1])
Я немного расширил @BenMcCormicks. Он работал для обычных строк, но не если бы у меня были экранированные символы или подстановочные знаки. Вот что я сделал
str = "[curl] 6: blah blah 234433 blah blah"; mapObj = {'\[curl] *': '', '\d: *': ''}; function replaceAll (str, mapObj) { var arr = Object.keys(mapObj), re; $.each(arr, function (key, value) { re = new RegExp(value, "g"); str = str.replace(re, function (matched) { return mapObj[value]; }); }); return str; } replaceAll(str, mapObj)возвращает "бла-бла 234433 бла-бла"
таким образом, он будет соответствовать ключу в mapObj, а не совпадающему слову'
С помощью Jquery заменить несколько строк с несколькими другими строками
var replacetext = { "abc": "123", "def": "456" "ghi": "789" }; $.each(replacetext, function(txtorig,txtnew) { $(".eng-to-urd").each(function(){ $(this).text($(this).text().replace(txtorig, txtnew)); }); });
Comments