échapper le point d'interrogation dans le javascript regex

90

C'est une question simple, je pense.

J'essaie de rechercher l'occurrence d'une chaîne dans une autre chaîne en utilisant regex en JavaScript comme ceci:

 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 du ?personnage ... J'ai essayé de m'échapper \, mais cela ne fonctionne pas non plus. Existe-t-il une autre façon d'utiliser ?littéralement au lieu de comme caractère spécial?

Andrew
la source
Le pire à ce sujet est que même utiliser une chaîne au lieu d'une expression régulière pose ce problème, par exemple str.search("?")cela semble définitivement être un bogue car ce n'est pas une expression régulière et ne devrait pas être traité comme tel. 🤦
Synetech

Réponses:

26

Vous devez utiliser une double barre oblique:

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

Pourquoi? car en JavaScript, il \est également utilisé pour échapper des caractères dans les chaînes, donc: "\?" devient:"?"

Et "\\?"devient "\?"

Christian C. Salvadó
la source
16

Vous pouvez délimiter votre expression rationnelle avec des barres obliques au lieu de guillemets, puis une seule barre oblique inverse pour échapper au point d'interrogation. Essaye ça:

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

Chaque fois que vous avez un modèle connu (c'est-à-dire que vous n'utilisez pas de variable pour construire un RegExp), utilisez la notation littérale de regex où vous n'avez besoin d'utiliser que des barres obliques inverses simples pour échapper aux métacaractères spéciaux de regex:

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

Chaque fois que vous avez besoin de construire un RegExp dynamiquement, utilisez la RegExpnotation constructeur où vous DEVEZ doubler les contre-obliques pour qu'elles désignent une contre - oblique 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.rawlittéral de chaîne, vous pouvez l'utiliser \tel quel (voir un exemple d'utilisation d'un littéral de chaîne de modèle où vous pouvez placer des variables dans le modèle 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 chez MDN.

Wiktor Stribiżew
la source