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?


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 "\?"


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;

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.