punto interrogativo di escape in javascript regex


91

Questa è una domanda semplice, credo.

Sto cercando di cercare l'occorrenza di una stringa in un'altra stringa usando regex in JavaScript in questo modo:

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

Questo non funziona a causa del ?personaggio ... Ho provato a scappare con \, ma non funziona neanche. C'è un altro modo per usare ?letteralmente invece che come carattere speciale?


La parte peggiore di questo è che anche l'uso di una stringa invece di una regex causa questo problema, ad esempio str.search("?")questo sembra decisamente un bug perché non è un'espressione regolare e non dovrebbe essere trattata come tale. 🤦
Synetech

Risposte:



26

Dovresti usare la doppia barra:

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

Perché? perché in JavaScript \viene utilizzato anche per eseguire l'escape dei caratteri nelle stringhe, quindi: "\?" diventa:"?"

E "\\?"diventa "\?"


16

Puoi delimitare la tua espressione regolare con barre anziché virgolette e quindi una singola barra rovesciata per sfuggire al punto interrogativo. Prova questo:

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

6

Ogni volta che hai un pattern noto (cioè non usi una variabile per creare una RegExp), usa la notazione regex letterale in cui devi solo usare singole barre rovesciate per sfuggire ai metacaratteri regex speciali:

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

Ogni volta che è necessario creare dinamicamente una RegExp, utilizzare la RegExpnotazione del costruttore in cui DEVI raddoppiare le barre rovesciate per denotarle letteralmente :

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 usi la String.rawstringa letterale puoi usare così \com'è (vedi un esempio di utilizzo di una stringa letterale modello in cui puoi inserire variabili nel modello 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

Una lettura obbligata: RegExp: Description at MDN.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.