2017-10-18 5 views
0

Je suis assez nouveau à Regexp et il semble que le \ est utilisé pour les caractères méta. Mon problème est que je veux rechercher cette chaîne exactement \"mediaType\":\"img\"Comment faire une barre oblique littérale en utilisant Regexp dans JS

Maintenant, je veux aussi mettre une variable dans img. Donc, je veux que ce soit quelque chose comme ça

new RegExp(`\"mediaType\":\"${variable}\"`) 

Comment écrire ceci pour que cela fonctionne?

+1

Utilisez: 'new Regex ('\\\\" mediaType \\\\ ": \\\\" img \\\\ "')' – anubhava

+1

'\' est un caractère d'échappement dans les deux chaînes javascript et régulière expression. Vous devez échapper à votre évasion. Aussi, vous n'avez pas besoin d'échapper '' 'dans regex (si c'est ce que vous essayez de faire – ctwheels

+0

@ctwheels J'ai besoin de' '' car il fait partie de la chaîne que je recherche –

Répondre

1

Réponse courte:

function escapeRegEx(s) { 
    return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); 
} 

var expression = new RegExp('\\\\"mediaType\\\\":\\\\"' + escapeRegEx(variable) + '\\\\"'); 
// or, using a template literal: 
var expression = new RegExp(`\\\\"mediaType\\\\":\\\\"${escapeRegEx(variable)}\\\\"`); 

Réponse longue:

En plus d'être utilisé pour les caractères meta, backslash dans les expressions régulières peuvent être utilisées pour échapper à des personnages qui auraient autrement un sens (comme * , $, parenthèses, et \). La manière de faire correspondre une barre oblique inverse dans une expression régulière consiste donc à en ajouter une autre en tant que caractère d'échappement: \\. En prenant cela en compte, l'expression régulière que vous voulez terminer est \\"mediaType\\":\\"img\\", et si vous utilisiez un littéral d'expression régulière, ce serait le cas. Malheureusement, il devient un peu plus impliqué parce que vous devez créer une expression de manière dynamique, vous devez fournir l'expression comme une chaîne, qui doit également les barres obliques inversées. Cela ajoute une deuxième couche d'échappement, donc vous devez doubler chacun des caractères \ à nouveau, et vous finissez avec new RegExp('\\\\"mediaType\\\\":\\\\"img\\\\"').

Une autre complication est que vous voulez que le contenu de variable soit mis en correspondance littéralement, pas interprété comme une expression régulière. Malheureusement, il n'existe pas de méthode intégrée permettant d'échapper automatiquement les expressions régulières dans JavaScript. Vous devez donc utiliser l'une des solutions dans Is there a RegExp.escape function in Javascript?. J'ai utilisé une version légèrement modifiée de la réponse acceptée qui la définit comme une fonction autonome au lieu de l'ajouter à l'objet RegExp. La solution exacte n'a pas d'importance, tant que vous échappez à la partie dynamique.

+1

Sinon, gardez le template littéral: '' new RegExp ('\\\\" mediaType \\\\ ": \\\\" $ {escapeRegex (variable)} \\\\ "' ')' 'pour éviter toute confusion sur '' '' '' '' '' ' – Bergi

+1

@Bergi C'est un bon point, j'ai utilisé la concaténation par habitude, mais ils ont utilisé un template littéral dans la question, je l'ajouterai comme alternative. –