1. ホーム
  2. ジャバスクリプト

[解決済み】複数の文字列を別の複数の文字列に置き換える

2022-04-17 07:30:51

質問

文字列の中の複数の単語を他の複数の単語に置き換えようとしています。文字列は、"私は猫と犬とヤギを飼っています"です。

しかし、これでは "I have a dog, a goat, and a cat" とはならず、代わりに "I have a cat, a cat, and a cat" が出力されます。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".

解決方法は?

の答えとして。

<ブロッククオート

最新答案募集中

今の例のように、"words" を使っている場合、以下のように拡張することができます。 ベン・マコーミック を使用して、非捕捉グループと単語境界を追加します。 \b を左と右に置いて部分一致を防いでいます。

\b(?:cathy|cat|catch)\b

  • \b 部分一致を防ぐためのワードバウンダリ
  • (?: 非捕捉グループ
    • cathy|cat|catch 選択肢の1つに一致する
  • ) 非捕獲グループを閉じる
  • \b 部分一致を防ぐためのワードバウンダリ

元の質問に対する例

let str = "I have a cat, a dog, and a goat.";
const mapObj = {
  cat: "dog",
  dog: "goat",
  goat: "cat"
};
str = str.replace(/\b(?:cat|dog|goat)\b/gi, matched => mapObj[matched]);
console.log(str);

うまくいっていないようなコメントでの例。

let str = "I have a cat, a catch, and a cathy.";
const mapObj = {
  cathy: "cat",
  cat: "catch",
  catch: "cathy"

};
str = str.replace(/\b(?:cathy|cat|catch)\b/gi, matched => mapObj[matched]);
console.log(str);