J'essaie de remplacer plusieurs mots d'une chaîne par plusieurs autres mots. La chaîne est «J'ai un chat, un chien et une chèvre».
Cependant, cela ne produit pas "J'ai un chien, une chèvre et un chat", mais cela produit plutôt "J'ai un chat, un chat et un chat". Est-il possible de remplacer plusieurs chaînes par plusieurs autres chaînes en même temps en JavaScript, afin que le résultat correct soit produit?
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".
Réponses:
Solution spécifique
Vous pouvez utiliser une fonction pour remplacer chacun d'eux.
exemple jsfiddle
La généraliser
Si vous souhaitez maintenir dynamiquement l'expression régulière et simplement ajouter de futurs échanges à la carte, vous pouvez le faire
pour générer l'expression régulière. Alors ça ressemblerait à ça
Et pour ajouter ou modifier d'autres remplacements, vous pouvez simplement modifier la carte.
violon avec regex dynamique
Rendre réutilisable
Si vous voulez que ce soit un modèle général, vous pouvez le retirer à une fonction comme celle-ci
Donc, vous pouvez simplement passer la str et une carte des remplacements que vous souhaitez à la fonction et cela retournera la chaîne transformée.
violon avec fonction
Pour garantir que Object.keys fonctionne dans les anciens navigateurs, ajoutez un polyfill, par exemple à partir de MDN ou Es5 .
la source
.
notation avec toutes ces propriétés. La notation entre parenthèses fonctionne avec n'importe quelle chaîne.map={'.': ',', ',': '.'}
et regex/\.|,/g
.return mapObj[matched.toLowerCase()];
justereturn mapObj[matched];
que j'utilise des clés cas sensiblesmapObj
.Object.keys(mapObj).map(key => key.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')).join('|')
. Inspiré par cette réponseCela peut ne pas répondre à votre besoin exact dans ce cas, mais j'ai trouvé que c'était un moyen utile de remplacer plusieurs paramètres dans les chaînes, comme solution générale. Il remplacera toutes les instances des paramètres, quel que soit le nombre de fois où ils sont référencés:
Vous l'invoqueriez comme suit:
la source
Utilisez des éléments numérotés pour éviter de les remplacer à nouveau. par exemple
puis
Comment ça marche: -% \ d + trouve les nombres qui viennent après un%. Les crochets capturent le nombre.
Ce nombre (sous forme de chaîne) est le deuxième paramètre, n, de la fonction lambda.
Le + n-1 convertit la chaîne en nombre puis 1 est soustrait pour indexer le tableau pets.
Le nombre% est ensuite remplacé par la chaîne à l'index du tableau.
Le / g provoque l'appel répété de la fonction lambda avec chaque numéro qui est ensuite remplacé par une chaîne du tableau.
En JavaScript moderne: -
la source
Cela a fonctionné pour moi:
la source
en utilisant Array.prototype.reduce () :
Exemple
la source
${f}
au lieu de f pour la valeur cumulée?${f}
.replace (new RegExp (Object.keys (s) [ 0], 'g'), s [Object.keys (s) [0]]), phrase1) "Juste au cas où quelqu'un se demanderait pourquoi la solution de l'affiche originale ne fonctionne pas:
la source
fonction régulière de l'utilisateur pour définir le modèle à remplacer, puis utiliser la fonction de remplacement pour travailler sur la chaîne d'entrée,
la source
RegExp
objet pourrait résoudre le problèmevar i = new RegExp('}','g'), j = new RegExp('{','g'), k = data.replace(i,'{').replace(j,'}');
Avec mon package à remplacement unique , vous pouvez effectuer les opérations suivantes:
la source
la source
Vous pouvez rechercher et remplacer une chaîne à l'aide de délimiteurs.
la source
/ * méthode replaceSome pour les chaînes qu'il faut autant, autant d'arguments que nous voulons et les remplace tous par le dernier argument pour lequel nous avons spécifié 2013 CopyRights enregistré pour: Max Ahmed voici un exemple:
* /
jsFiddle: http://jsfiddle.net/CPj89/
la source
la source
J'ai écrit ce package npm stringinject https://www.npmjs.com/package/stringinject qui vous permet de faire ce qui suit
qui remplacera les {0} et {1} par les éléments du tableau et renverra la chaîne suivante
ou vous pouvez remplacer les espaces réservés par des clés d'objet et des valeurs comme ceci:
la source
Vous pouvez utiliser https://www.npmjs.com/package/union-replacer à cet effet. Il s'agit essentiellement d'une
string.replace(regexp, ...)
contrepartie, qui permet à plusieurs remplacements de se produire en une seule passe tout en préservant la pleine puissance destring.replace(...)
.Divulgation: je suis l'auteur. La bibliothèque a été développée pour prendre en charge des remplacements configurables par l'utilisateur plus complexes et elle traite toutes les choses problématiques comme les groupes de capture, les références arrières et les remplacements de fonctions de rappel.
Les solutions ci-dessus sont cependant assez bonnes pour des remplacements de chaînes exacts.
la source
en utilisant la fonction prototype, nous pouvons remplacer facilement en passant un objet avec des clés et des valeurs et du texte remplaçable
la source
J'ai développé un peu @BenMcCormicks. Il travaillait pour des cordes régulières mais pas si j'avais échappé à des caractères ou à des caractères génériques. Voici ce que j'ai fait
renvoie "bla bla 234433 bla bla"
De cette façon, il correspondra à la clé dans mapObj et non au mot correspondant '
la source
Solution avec Jquery (incluez d'abord ce fichier): remplacez plusieurs chaînes par plusieurs autres chaînes:
la source
javascript tag added in question, and jquery is a libarary of javascript.
Hmmm que la logique est désactivée, cela devrait être l'inverse, et aussi juste un avertissement - à partir des informations de balise javascript: " À moins qu'une autre balise pour un framework / bibliothèque soit également incluse, une réponse JavaScript pure est attendue. "