escapando do ponto de interrogação em regex javascript

91

Esta é uma pergunta simples, eu acho.

Estou tentando pesquisar a ocorrência de uma string em outra string usando regex em JavaScript assim:

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

Isso não funciona por causa do ?personagem .... Eu tentei escapar com \, mas também não funcionou. Existe outra maneira de usar ?literalmente em vez de um caractere especial?

Andrew
fonte
A pior parte sobre isso é que até mesmo usar uma string em vez de um regex causa esse problema, por exemplo, str.search("?")isso definitivamente parece um bug porque não é um regex e não deve ser tratado como um. 🤦
Synetech

Respostas:

26

Você deve usar barra dupla:

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

Por quê? porque em JavaScript o \também é usado para escapar caracteres em strings, então: "\?" torna-se:"?"

E "\\?", torna-se "\?"

Christian C. Salvadó
fonte
16

Você pode delimitar sua regexp com barras em vez de aspas e, em seguida, uma única barra invertida para escapar do ponto de interrogação. Experimente isto:

var gent = /I like your Apartment. Could we schedule a viewing\?/g;
jiggy
fonte
6

Sempre que você tiver um padrão conhecido (ou seja, você não usar uma variável para construir um RegExp), use a notação literal de regex, onde você só precisa usar barras invertidas simples para escapar de metacaracteres regex especiais:

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

Sempre que você precisar construir um RegExp dinamicamente, use a RegExpnotação do construtor onde você DEVE dobrar as barras invertidas para que denotem uma 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");

E se você usar o String.rawliteral de string, você pode usar \como está (veja um exemplo de uso de um literal de string de modelo onde você pode colocar variáveis ​​no padrão regex):

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

Uma leitura obrigatória: RegExp: Descrição em MDN.

Wiktor Stribiżew
fonte