escapar del signo de interrogación en regex javascript

90

Creo que esta es una pregunta simple.

Estoy tratando de buscar la aparición de una cadena en otra cadena usando expresiones regulares en JavaScript así:

 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');     
 }          

Esto no funciona por el ?personaje ... Traté de escapar \, pero tampoco funciona. ¿Hay otra forma de usarlo ?literalmente en lugar de como un carácter especial?

Andrés
fuente
La peor parte de esto es que incluso usar una cadena en lugar de una expresión regular causa este problema, por ejemplo, str.search("?")eso definitivamente parece un error porque no es una expresión regular y no debería tratarse como tal. 🤦
Synetech

Respuestas:

26

Debes usar doble barra:

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

¿Por qué? porque en JavaScript \también se usa para escapar caracteres en cadenas, entonces: "\?" se convierte en:"?"

Y se "\\?"convierte en "\?"

Christian C. Salvadó
fuente
16

Puede delimitar su expresión regular con barras en lugar de comillas y luego una sola barra invertida para escapar del signo de interrogación. Prueba esto:

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

Siempre que tenga un patrón conocido (es decir, no use una variable para construir una RegExp), use la notación literal de expresiones regulares donde solo necesita usar barras invertidas simples para escapar de los metacaracteres especiales de expresiones regulares:

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

Siempre que necesite construir una expresión regular dinámicamente, use la RegExpnotación del constructor donde DEBE duplicar barras invertidas para que denoten una barra invertida literal :

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");

Y si usa el String.rawliteral de cadena, puede usarlo \tal cual (vea un ejemplo de cómo usar un literal de cadena de plantilla donde puede poner variables en el patrón de expresiones regulares):

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

Una lectura obligada: RegExp: Descripción en MDN.

Wiktor Stribiżew
fuente