Disons que je voulais rendre les éléments suivants réutilisables:
function replace_foo(target, replacement) {
return target.replace("string_to_replace",replacement);
}
Je pourrais faire quelque chose comme ça:
function replace_foo(target, string_to_replace, replacement) {
return target.replace(string_to_replace,replacement);
}
Avec les chaînes littérales, c'est assez simple. Mais que faire si je veux devenir un peu plus délicat avec l'expression régulière? Par exemple, disons que je veux tout remplacer mais string_to_replace
. Instinctivement, j'essaierais d'étendre ce qui précède en faisant quelque chose comme:
function replace_foo(target, string_to_replace, replacement) {
return target.replace(/^string_to_replace/,replacement);
}
Cela ne semble pas fonctionner. Je suppose qu'il pense qu'il string_to_replace
s'agit d'une chaîne littérale, plutôt qu'une variable représentant une chaîne. Est-il possible de créer des expressions régulières JavaScript à la volée en utilisant des variables de chaîne? Quelque chose comme ça serait génial si possible:
function replace_foo(target, string_to_replace, replacement) {
var regex = "/^" + string_to_replace + "/";
return target.replace(regex,replacement);
}
la source
/
délimiteurs de regex lorsque vous utilisez également ce formulaire.Pas vraiment! L'exemple ne remplace que la première occurrence de
string_to_replace
. Le plus souvent, vous souhaitez remplacer toutes les occurrences, auquel cas vous devez convertir la chaîne en un/.../g
RegExp global ( ). Vous pouvez le faire à partir d'une chaîne en utilisant lenew RegExp
constructeur:Le problème avec ceci est que tous les caractères spéciaux de regex dans la chaîne littérale se comporteront de leur manière spéciale au lieu d'être des caractères normaux. Vous devrez leur échapper une barre oblique inverse pour résoudre ce problème. Malheureusement, il n'y a pas de fonction intégrée pour faire cela pour vous, alors en voici une que vous pouvez utiliser:
Notez également que lorsque vous utilisez une expression rationnelle
replace()
, la chaîne de remplacement a maintenant un caractère spécial aussi$
. Cela doit également être échappé si vous voulez avoir un littéral$
dans votre texte de remplacement!(Quatre
$
s parce que c'est en soi une chaîne de remplacement - argh!)Vous pouvez maintenant implémenter le remplacement de chaîne global avec RegExp:
Quelle douleur. Heureusement, si tout ce que vous voulez faire est un remplacement de chaîne droite sans parties supplémentaires de regex, il existe un moyen plus rapide:
...et c'est tout. C'est un idiome communément compris.
Qu'est-ce que cela signifie, vous souhaitez remplacer toutes les parties de texte ne participant pas à une correspondance par rapport à la chaîne? Un remplacement par
^
n'est certainement pas cela, car cela^
signifie un jeton de début de chaîne, pas une négation.^
n'est qu'une négation dans les[]
groupes de caractères. Il y a aussi des anticipations de recherche négatives(?!...)
, mais il y a des problèmes avec cela dans JScript donc vous devriez généralement l'éviter.Vous pouvez essayer de faire correspondre `` tout jusqu'à '' la chaîne et d'utiliser une fonction pour supprimer tout étirement vide entre les chaînes correspondantes:
Ici encore, une scission pourrait être plus simple:
la source
Comme les autres l'ont dit, utilisez
new RegExp(pattern, flags)
pour le faire. Il est à noter que vous passerez des chaînes littérales dans ce constructeur, donc chaque barre oblique inverse devra être échappée. Si, par exemple, vous vouliez que votre regex corresponde à une barre oblique inverse, vous auriez besoin de le direnew RegExp('\\\\')
, alors que le littéral regex n'aurait besoin que de l'être/\\/
. En fonction de la façon dont vous comptez utiliser cela, vous devez vous méfier de la transmission des entrées utilisateur à une telle fonction sans un prétraitement adéquat (échappement de caractères spéciaux, etc.) Sans cela, vos utilisateurs peuvent obtenir des résultats très inattendus.la source
/\b[term]\B/
, mais lors de la construction, je dois appelernew RegExp("\\b"+ term + "\\B")
. Petite mais importante différence, et difficile à repérer depuis l' utiliser comme regex directement fait le travail comme prévu.Oui, vous pouvez.
https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions
la source
Je pense que j'ai un très bon exemple pour mettre en évidence le texte dans la chaîne (il ne trouve pas de recherche au registre mais mis en évidence à l'aide du registre)
http://jsfiddle.net/cdbzL/1258/
la source
Une solution très simple à cela est la suivante:
Pas besoin de regex du tout
Il semble également être le plus rapide sur les navigateurs modernes https://jsperf.com/replace-vs-split-join-vs-replaceall
la source