Je voudrais créer une String.replaceAll()
méthode en JavaScript et je pense que l'utilisation d'une expression régulière serait la manière la plus laconique de le faire. Cependant, je ne peux pas comprendre comment passer une variable dans une expression régulière. Je peux déjà le faire, ce qui remplacera toutes les instances de "B"
with "A"
.
"ABABAB".replace(/B/g, "A");
Mais je veux faire quelque chose comme ça:
String.prototype.replaceAll = function(replaceThis, withThis) {
this.replace(/replaceThis/g, withThis);
};
Mais évidemment, cela ne remplacera que le texte "replaceThis"
... alors comment puis-je passer cette variable dans ma chaîne d'expression régulière?
javascript
regex
JC Grubbs
la source
la source
Réponses:
Au lieu d'utiliser la
/regex/g
syntaxe, vous pouvez construire un nouvel objet RegExp :Vous pouvez créer dynamiquement des objets regex de cette façon. Ensuite, vous ferez:
la source
/\/word\:\w*$/
, assurez - vous d'échapper à vos antislashs:new RegExp( '\\/word\\:\\w*$' )
./
n'a pas de signification particulière si vous construisez une expression régulière à partir d'une chaîne, vous n'avez donc pas besoin de l'échapper./\/word\:\w*$/
devrait êtrenew RegExp('/word\\:\\w*$')
Comme Eric Wendelin l'a mentionné, vous pouvez faire quelque chose comme ceci:
Cela donne
"regex matching ."
. Cependant, il échouera si str1 l'est"."
. Vous vous attendriez à ce que le résultat soit"pattern matching regex"
, en remplaçant la période par"regex"
, mais il se révélera être ...Cela est dû au fait que, bien qu'il s'agisse d'
"."
une chaîne, dans le constructeur RegExp, il est toujours interprété comme une expression régulière, ce qui signifie tout caractère sans saut de ligne, ce qui signifie chaque caractère de la chaîne. À cet effet, la fonction suivante peut être utile:Ensuite, vous pouvez faire:
céder
"pattern matching regex"
.la source
-
et incluent=!:/
.Comme toujours: n'utilisez pas l'expression régulière sauf si vous le devez. Pour un simple remplacement de chaîne, l'idiome est:
Ensuite, vous n'avez pas à vous soucier des problèmes de citation mentionnés dans la réponse de Gracenotes.
la source
split
etreplace
peuvent prendre une chaîne ou unRegExp
objet. Le problème quereplace
celasplit
ne pose pas est que lorsque vous utilisez une chaîne, vous n'obtenez qu'un seul remplacement.Si vous voulez obtenir TOUTES les occurrences (
g
), soyez insensible à la casse (i
) et utilisez des limites pour que ce ne soit pas un mot dans un autre mot (\\b
):Exemple:
la source
rx
une interpolation Emacs / -style, via des chaînes de modèle.)Pour tous ceux qui cherchent à utiliser une variable avec la méthode de correspondance , cela a fonctionné pour moi
la source
Cette:
est équivalent à ceci:
Voir http://www.w3schools.com/jsref/jsref_obj_regexp.asp .
la source
pattern
comme variable, dans le 2ème comme une chaînela source
Vous voulez construire l'expression régulière dynamiquement et pour cela, la bonne solution est d'utiliser le
new RegExp(string)
constructeur. Pour que le constructeur traite les caractères spéciaux littéralement , vous devez leur échapper. Il y a une fonction intégrée dans le widget de saisie semi-automatique jQuery UI appelée$.ui.autocomplete.escapeRegex
:Si vous utilisez jQuery UI, vous pouvez utiliser cette fonction ou copier sa définition à partir de la source :
Et utilisez-le comme ceci:
la source
Testez avec cet outil
la source
Testez-le comme:
la source
Voici une autre implémentation replaceAll:
la source
Et la version coffeescript de la réponse de Steven Penny, puisque c'est le résultat n ° 2 de Google .... même si le café est juste javascript avec beaucoup de caractères supprimés ...;)
et dans mon cas particulier
la source
robot.name=hubot
n'est pas javascript.Bien que vous puissiez créer des RegExp créés dynamiquement (selon les autres réponses à cette question), je ferai écho à mon commentaire d'un article similaire : La forme fonctionnelle de String.replace () est extrêmement utile et dans de nombreux cas, réduit le besoin de objets RegExp créés dynamiquement. (qui sont un peu pénibles, car vous devez exprimer l'entrée du constructeur RegExp sous forme de chaîne plutôt que d'utiliser le format littéral slash / [AZ] + / regexp)
la source
Pour satisfaire mon besoin d'insérer une variable / alias / fonction dans une expression régulière, voici ce que j'ai trouvé:
où 'oldre' est l'expression rationnelle d'origine que je veux insérer une variable, 'xx' est l'espace réservé pour cette variable / alias / fonction, et 'yy' est le nom de variable, l'alias ou la fonction réelle.
la source
Vous pouvez l'utiliser si $ 1 ne fonctionne pas avec vous
la source
Vous pouvez toujours utiliser à
indexOf
plusieurs reprises:Cela ne va pas dans une boucle infinie lorsque le remplacement contient la correspondance.
la source
Votre solution est ici:
Passez une variable à une expression régulière.
Celui que j'ai mis en œuvre consiste à prendre la valeur d'un champ de texte qui est celui que vous souhaitez remplacer et un autre est le champ de texte "remplacer par", en obtenant la valeur du champ de texte dans une variable et en définissant la variable sur RegExp fonction à remplacer. Dans mon cas, j'utilise Jquery, vous pouvez également le faire uniquement avec JavaScript.
Code JavaScript:
Ce code est sur événement Onclick d'un bouton, vous pouvez le mettre dans une fonction à appeler.
Alors maintenant, vous pouvez passer une variable dans la fonction de remplacement.
la source
Cette fonction auto-appelée itérera sur replacerItems à l'aide d'un index et changera globalement replacerItems [index] sur la chaîne à chaque passage.
la source
Aucune de ces réponses n'était claire pour moi. J'ai finalement trouvé une bonne explication sur http://burnignorance.com/php-programming-tips/how-to-use-a-variable-in-replace-function-of-javascript/
La réponse simple est:
Par exemple:
la source
var
ici. De plus, si vous passez\b
ou\1
cela casserait.Pour plusieurs remplacements sans expressions régulières, je suis allé avec ce qui suit:
La partie importante de la solution a été trouvée ici
la source