Замените несколько строк несколькими другими строками



Я пытаюсь заменить несколько слов в строку с несколькими другими словами. Строка: "у меня есть кошка, собака и коза."



однако это не производит "у меня есть собака, коза и кошка", но вместо этого он производит "у меня есть кошка, Кошка и кошка". Можно ли заменить несколько строк несколькими другими строками одновременно в 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".
600   12  

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];
});

пример jsfiddle

обобщить это

если вы хотите динамически поддерживать регулярное выражение и просто добавлять будущие обмены на карту, вы можете сделать это

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='&nbsp';}
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

    Ничего не найдено.