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 = "\\?";
var initial_subpattern = "I like your Apartment\\. Could we schedule a viewing";
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`\?`;
const initial_subpattern = "I like your Apartment\\. Could we schedule a viewing";
const re = new RegExp(`${initial_subpattern}${questionmark_block}`, 'g');
console.log(re);
Una lectura obligada: RegExp: Descripción en MDN.
str.search("?")
eso definitivamente parece un error porque no es una expresión regular y no debería tratarse como tal. 🤦