Всякий раз, коли у вас є відомий шаблон (тобто ви не використовуєте змінну для побудови 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("?")
Це, безумовно, здається помилкою, оскільки це не регулярний вираз, і його не слід розглядати як один. 🤦