Remplacer plusieurs chaînes avec plusieurs autres chaînes
Je suis en train de remplacer plusieurs mots dans une chaîne avec plusieurs autres mots. La chaîne est "j'ai un chat, un chien et une chèvre."
Toutefois, cela ne produit pas "j'ai un chien, une chèvre, et un chat", mais au lieu de cela, il produit "j'ai un chat, un chat, et un chat". Est-il possible de remplacer les multiples chaînes avec plusieurs autres chaînes en même temps, en JavaScript, de sorte que le résultat correct sera produite?
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".
- Je veux remplacer plusieurs mots dans une chaîne avec plusieurs d'autres termes, sans le remplacement des mots qui ont déjà été remplacés.
- j'ai quelques différents requête, si je dnt sais utilisateur va entrer dans un chat ou un chien ou une chèvre(c'est au hasard à venir), mais à chaque fois que ce genre de mot viendra je besoin de le remplacer avec disons que "l'animal". comment obtenir ce scénario
Vous devez vous connecter pour publier un commentaire.
Solution Spécifique
Vous pouvez utiliser une fonction pour remplacer chacun.
jsfiddle exemple
Généraliser
Si vous de vouloir maintenir le regex et ajoutez simplement les échanges futurs à la carte, vous pouvez le faire
pour générer les regex. Alors il devrait ressembler à ceci
Et pour ajouter ou modifier plusieurs remplacements vous pouvez simplement modifier la carte.
bricoler avec la dynamique regex
Rendant Réutilisables
Si vous voulez que ce soit une tendance générale vous pourriez tirer à une fonction comme ceci
Alors vous pouvez simplement passer le str et une carte de remplacement vous voulez à la fonction et il serait de retour le transformer en chaîne.
jouer avec la fonction
Pour s'assurer de l'Objet.touches fonctionne dans les navigateurs plus anciens, ajouter un polyfill, par exemple à partir MDN ou Es5.
.
notation de l'ensemble de ces biens. Supports de notation fonctionne avec n'importe quelle chaîne.map={'.': ',', ',': '.'}
et regex/\.|,/g
.return mapObj[matched.toLowerCase()];
justereturn mapObj[matched];
depuis que j'utilise la casse des clés dansmapObj
.dogs
cats
ensuite fait tous lescats
dogs
, chaque mot qui a été à l'originedogs
oucats
constitueraitdogs
dog
,doge
. Seul le premier dans la RegExp sera à la hauteur. C'est-à-diredog|doge
correspondradog
toutdoge|dog
échoueradog
Object.keys(mapObj).map(key => key.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')).join('|')
. Inspiré par le cette réponseCela peut ne pas répondre exactement à vos besoins, dans ce cas, mais j'ai trouvé que c'était un moyen utile pour remplacer les multiples paramètres dans les chaînes, comme une solution générale. Il va remplacer toutes les instances de l'paramètres, peu importe combien de fois ils sont référencés:
Vous invoquez comme suit:
Utilisation des éléments numérotés pour éviter de remplacer à nouveau.
par exemple
puis
Comment cela fonctionne:-
%\d+ trouve les chiffres qui viennent après qu'un %. Les supports de capturer le nombre.
Ce numéro (comme une chaîne de caractères) est le 2ème paramètre, n, la fonction lambda.
L' +n-1 convertit la chaîne de caractères pour le numéro, puis 1 est soustrait à l'index les animaux de compagnie de tableau.
L' %nombre est alors remplacé par la chaîne à l'index du tableau.
Le /g causes de la fonction lambda être appelée plusieurs fois avec chaque numéro, qui est ensuite remplacé par une chaîne à partir de la matrice.
Moderne JavaScript:-
Cela a fonctionné pour moi:
Juste au cas où quelqu'un se demande pourquoi l'affiche originale de la solution n'est pas de travail:
à l'aide de Tableau.le prototype.réduire():
Exemple
JS:
${f}
au lieu de f pour l'accumulation de la valeur?${f}
.replace(new RegExp(Objet.les touches(s)[0],'g'), s[Objet.les touches(s)[0]]), sentence1)"utilisateur régulier de la fonction pour définir le modèle pour le remplacer, puis utiliser la fonction remplacer de travail sur la chaîne d'entrée,
RegExp
objet pourrait résoudre le problèmevar i = new RegExp('}','g'), j = new RegExp('{','g'), k = data.replace(i,'{').replace(j,'}');
/*
replaceSome méthode pour cordes
il faut que ,beaucoup d'arguments que nous voulons et remplace toutes les
avec le dernier argument que nous avons spécifié
2013 droits d'Auteur enregistré pour: Max Ahmed
ceci est un exemple:
*/
jsFiddle: http://jsfiddle.net/CPj89/
J'ai écrit ce package npm stringinject https://www.npmjs.com/package/stringinject qui vous permet d'effectuer les opérations suivantes
qui remplacera le {0} et {1}, avec les éléments de tableau et de retourner à la chaîne suivante
ou vous pouvez remplacer les espaces réservés à l'objet des clés et des valeurs comme:
Avec mon remplacez-une fois paquet, vous pouvez faire ce qui suit:
Vous pouvez trouver et remplacer les cordes à l'aide de séparateurs.
JS:
J'ai développé sur @BenMcCormicks un peu. Son travaillé régulièrement des cordes, mais pas si j'avais échappé 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 sera en adéquation avec la clé dans le mapObj et pas de la correspondance mot"
Solution avec Jquery (première inclure ce fichier): Remplacer plusieurs chaînes avec plusieurs autres chaînes:
jquery is necessary item for web applications
est tout simplement faux.