Всякий раз, когда у вас есть известный шаблон (то есть вы не используете переменную для построения RegExp), используйте буквальную нотацию регулярного выражения, где вам нужно использовать только одиночные обратные косые черты, чтобы избежать специальных метасимволов регулярного выражения:
var re = /I like your Apartment\. Could we schedule a viewing\?/g;
^^ ^^
Всякий раз, когда вам нужно создать RegExp динамически, используйте RegExp
нотацию конструктора, в которой вы ДОЛЖНЫ использовать двойную обратную косую черту для обозначения буквальной обратной косой черты :
var questionmark_block = "\\?";
var initial_subpattern = "I like your Apartment\\. Could we schedule a viewing";
var re = new RegExp(initial_subpattern + questionmark_block, "g");
И если вы используете String.raw
строковый литерал, вы можете использовать его \
как есть (см. Пример использования строкового литерала шаблона, где вы можете помещать переменные в шаблон регулярного выражения):
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);
Обязательно прочтите: RegExp: Описание в MDN.
str.search("?")
это определенно похоже на ошибку, потому что это не регулярное выражение и не должно рассматриваться как одно. 🤦