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?
javascript
regex
literals
Andrés
fuente
fuente
str.search("?")
eso definitivamente parece un error porque no es una expresión regular y no debería tratarse como tal. 🤦Respuestas:
Necesitas escapar con dos barras invertidas.
Vea esto para más detalles:
http://www.trans4mind.com/personal_development/JavaScript/Regular%20Expressions%20Simple%20Usage.htm
fuente
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"\?"
fuente
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;
fuente
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
RegExp
notació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.raw
literal 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.
fuente