107 votes

échappement du point d'interrogation dans le regex javascript

C'est une question simple, je pense.

J'essaie de rechercher l'occurrence d'une chaîne dans une autre chaîne à l'aide d'une expression rationnelle en JavaScript, comme suit :

 var content ="Hi, I like your Apartment. Could we schedule a viewing? My phone number is: ";

 var gent = new RegExp("I like your Apartment. Could we schedule a viewing? My", "g");

 if(content.search(gent) != -1){   
     alert('worked');     
 }          

Cela ne fonctionne pas à cause de la ? caractère.... j'ai essayé de l'échapper avec \ mais cela ne fonctionne pas non plus. Existe-t-il un autre moyen d'utiliser ? littéralement plutôt que comme un caractère spécial ?

0 votes

Le pire dans tout ça, c'est que même l'utilisation d'une chaîne au lieu d'une regex provoque ce problème, par exemple str.search("?") Cela ressemble vraiment à un bogue car ce n'est pas une regex et elle ne devrait pas être traitée comme telle.

171voto

Jon Points 23749

Vous devez l'échapper avec deux antislashes.

\\?

Voir ceci pour plus de détails :

http://www.trans4mind.com/personal_development/JavaScript/Regular%20Expressions%20Simple%20Usage.htm

17 votes

Un pour la regex et un pour la déclinaison de la chaîne.

2 votes

Un coup de tête ! Après des années de travail avec les regex, je pensais avoir tout vu Mais non, voilà. Double évasion. Je suppose qu'un jour je verrai triple.

30voto

CMS Points 315406

Vous devez utiliser une double barre oblique :

var regex = new RegExp("\\?", "g");

Pourquoi ? Parce qu'en JavaScript, le \ est également utilisé pour échapper aux caractères dans les chaînes de caractères, ainsi : "\ ?" devient : "?"

Et "\\?" devient "\?"

17voto

jiggy Points 2388

Vous pouvez délimiter votre regexp avec des barres obliques au lieu de guillemets, puis avec une simple barre oblique inverse pour échapper au point d'interrogation. Essayez ceci :

var gent = /I like your Apartment. Could we schedule a viewing\?/g;

7voto

Wiktor Stribiżew Points 100073

Chaque fois que vous avez un connu sous le nom de (c'est-à-dire que vous n'utilisez pas une variable pour construire une RegExp), utilisez la fonction littéral où il suffit d'utiliser la notation regex. simple des antislashes pour échapper aux métacaractères spéciaux des regex :

var re = /I like your Apartment\. Could we schedule a viewing\?/g;
                               ^^                            ^^

Chaque fois que vous avez besoin de construire une RegExp de manière dynamique, utilisez RegExp notation des constructeurs où vous DEVEZ des doubles barres obliques inversées pour indiquer une barre oblique inversée littérale. :

var questionmark_block = "\\?"; // A literal ?
var initial_subpattern = "I like your Apartment\\. Could we schedule a viewing"; // Note the dot must also be escaped to match a literal dot
var re = new RegExp(initial_subpattern + questionmark_block, "g");

Et si vous utilisez le String.raw vous pouvez utiliser \ tel quel (voir un exemple d'utilisation d'un modèle de chaîne littérale où vous pouvez mettre des variables dans le motif regex) :

const questionmark_block = String.raw`\?`; // A literal ?
const initial_subpattern = "I like your Apartment\\. Could we schedule a viewing";
const re = new RegExp(`${initial_subpattern}${questionmark_block}`, 'g'); // Building pattern from two variables
console.log(re); // => /I like your Apartment\. Could we schedule a viewing\?/g

A lire absolument : RegExp : Description à MDN.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X