web-dev-qa-db-ja.com

複数の文字列を他の複数の文字列で置き換える

私は、文字列内の複数の単語を他の複数の単語に置き換えようとしています。文字列は "私は猫、犬、そして山羊です。"です。

しかし、これは「私は犬、山羊、そして猫を飼っている」ということではなく、「私は猫、猫、そして猫を飼っている」ということを意味します。 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".
162
Anderson Green

特定の解決策

あなたはそれぞれを置き換えるために関数を使うことができます。

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と必要な置換のマップを関数に渡すだけで、変換された文字列が返されます。

機能をいじる

Object.keysが確実に古いブラウザで動作するようにするには、 MDNEs5 などからpolyfillを追加します。

346
Ben McCormick

この場合、これはあなたの正確なニーズを満たすことはできないかもしれませんが、一般的な解決策として、文字列内の複数のパラメータを置き換える便利な方法を見つけました。参照された回数に関係なく、パラメータのすべてのインスタンスが置き換えられます。

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'
8
Iian

二度と取り替えることを防ぐために番号を付けられた項目を使用しなさい。例えば

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])
3
Quentin 2

これは私のために働いた:

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"
3
João Paulo

置換するパターンを定義してから置換関数を使用して入力文字列を処理するためのユーザー正規関数

var i = new RegExp('"{','g'),
    j = new RegExp('}"','g'),
    k = data.replace(i,'{').replace(j,'}');
2
KARTHIKEYAN.A

万が一、元のポスターの解決策がうまくいかない理由がだれかに疑問を投げかけています。

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."
1
jack
    var str = "I have a cat, a dog, and a goat.";

    str = str.replace(/goat/i, "cat");
    // now str = "I have a cat, a dog, and a cat."

    str = str.replace(/dog/i, "goat");
    // now str = "I have a cat, a goat, and a cat."

    str = str.replace(/cat/i, "dog");
    // now str = "I have a dog, a goat, and a cat."
0
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メソッドの引数として必要なだけ引数を取り、指定した最後の引数ですべて置き換えます。Max Ahmedこれは例です。

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/

0
nazih ahmed

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));
    });
});
0
Super Model
<!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>
0
Jalaluddin Rumi

私の replace-once パッケージを使うと、次のことができます。

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.'
0
Kodie Grantham

私はこのnpmパッケージstringinject https://www.npmjs.com/package/stringinject を書きました。

var string = stringInject("this is a {0} string for {1}", ["test", "stringInject"]);

これは{0}と{1}を配列itemsで置き換え、次の文字列を返します

"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" 
0
tjcafferkey

Array.prototype.reduce() を使うと:

const arrayOfObjects = [
  { plants: 'men' },
  { smart:'dumb' },
  { peace: 'war' }
]
const sentence = 'plants are smart'

arrayOfObjects.reduce(
  (f, s) => `${f}`.replace(Object.keys(s)[0], s[Object.keys(s)[0]]), sentence
)

// as a reusable function
const replaceManyStr = (obj, sentence) => obj.reduce((f, s) => `${f}`.replace(Object.keys(s)[0], s[Object.keys(s)[0]]), sentence)

const result = replaceManyStr(arrayOfObjects , sentence1)

// /////////////    1. replacing using reduce and objects

// arrayOfObjects.reduce((f, s) => `${f}`.replace(Object.keys(s)[0], s[Object.keys(s)[0]]), sentence)

// replaces the key in object with its value if found in the sentence
// doesn't break if words aren't found

// Example

const arrayOfObjects = [
  { plants: 'men' },
  { smart:'dumb' },
  { peace: 'war' }
]
const sentence1 = 'plants are smart'
const result1 = arrayOfObjects.reduce((f, s) => `${f}`.replace(Object.keys(s)[0], s[Object.keys(s)[0]]), sentence1)

console.log(result1)

// result1: 
// men are dumb


// Extra: string insertion python style with an array of words and indexes

// usage

// arrayOfWords.reduce((f, s, i) => `${f}`.replace(`{${i}}`, s), sentence)

// where arrayOfWords has words you want to insert in sentence

// Example

// replaces as many words in the sentence as are defined in the arrayOfWords
// use python type {0}, {1} etc notation

// five to replace
const sentence2 = '{0} is {1} and {2} are {3} every {5}'

// but four in array? doesn't break
const words2 = ['man','dumb','plants','smart']

// what happens ?
const result2 = words2.reduce((f, s, i) => `${f}`.replace(`{${i}}`, s), sentence2)

console.log(result2)

// result2: 
// man is dumb and plants are smart every {5}

// replaces as many words as are defined in the array
// three to replace
const sentence3 = '{0} is {1} and {2}'

// but five in array
const words3 = ['man','dumb','plant','smart']

// what happens ? doesn't break
const result3 = words3.reduce((f, s, i) => `${f}`.replace(`{${i}}`, s), sentence3)

console.log(result3)

// result3: 
// man is dumb and plants
0
Emmanuel N K