экранирование вопросительного знака в javascript регулярного выражения

90

Думаю, это простой вопрос.

Я пытаюсь найти вхождение строки в другой строке, используя регулярное выражение в JavaScript, например:

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

Это не работает из-за ?персонажа ... Я пытался сбежать с помощью \, но это тоже не сработало. Есть ли другой способ использовать ?буквально вместо специального символа?

Андрей
источник
Хуже всего то, что даже использование строки вместо регулярного выражения вызывает эту проблему, например, str.search("?")это определенно похоже на ошибку, потому что это не регулярное выражение и не должно рассматриваться как одно. 🤦
Synetech

Ответы:

150

Вам нужно избежать его двумя обратными косыми чертами

\\?

Смотрите это для более подробной информации:

http://www.trans4mind.com/personal_development/JavaScript/Regular%20Expressions%20Simple%20Usage.htm

Джон
источник
17
… Один для регулярного выражения и один для объявления строки.
Гамбо
Вынос мозга! После многих лет работы с регулярными выражениями мне показалось, что я все видел ... Но нет, вот и все. Двойной побег. Думаю, однажды я увижу тройку.
Geo
26

Вы должны использовать двойную косую черту:

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

Зачем? потому что в JavaScript \символ также используется для экранирования символов в строках, поэтому: "\?" становится:"?"

И "\\?"становится "\?"

Кристиан К. Сальвадо
источник
16

Вы можете ограничить свое регулярное выражение косой чертой вместо кавычек, а затем одной обратной косой чертой, чтобы избежать вопросительного знака. Попробуй это:

var gent = /I like your Apartment. Could we schedule a viewing\?/g;
джигги
источник
6

Всякий раз, когда у вас есть известный шаблон (то есть вы не используете переменную для построения RegExp), используйте буквальную нотацию регулярного выражения, где вам нужно использовать только одиночные обратные косые черты, чтобы избежать специальных метасимволов регулярного выражения:

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

Всякий раз, когда вам нужно создать RegExp динамически, используйте RegExpнотацию конструктора, в которой вы ДОЛЖНЫ использовать двойную обратную косую черту для обозначения буквальной обратной косой черты :

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

И если вы используете String.rawстроковый литерал, вы можете использовать его \как есть (см. Пример использования строкового литерала шаблона, где вы можете помещать переменные в шаблон регулярного выражения):

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

Обязательно прочтите: RegExp: Описание в MDN.

Виктор Стрибьев
источник