unikanie znaku zapytania w wyrażeniu regularnym javascript

90

Myślę, że to proste pytanie.

Próbuję wyszukać wystąpienie ciągu w innym ciągu za pomocą wyrażenia regularnego w JavaScript, jak na przykład:

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

To nie działa z powodu ?postaci ... Próbowałem uciec przed tym \, ale to też nie działa. Czy istnieje inny sposób użycia ?dosłownie zamiast znaku specjalnego?

Andrzej
źródło
Najgorsze w tym jest to, że nawet użycie łańcucha zamiast wyrażenia regularnego powoduje ten problem, np. str.search("?")To zdecydowanie wygląda na błąd, ponieważ nie jest to wyrażenie regularne i nie powinno być traktowane jako jeden. 🤦
Synetech

Odpowiedzi:

26

Powinieneś użyć podwójnego ukośnika:

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

Czemu? ponieważ w JavaScript \jest również używany do zmiany znaczenia znaków w łańcuchach, więc: „\?” staje się:"?"

I "\\?"staje się "\?"

Christian C. Salvadó
źródło
16

Możesz ograniczyć swoje wyrażenie regularne ukośnikami zamiast cudzysłowów, a następnie jednym lewym ukośnikiem, aby uniknąć znaku zapytania. Spróbuj tego:

var gent = /I like your Apartment. Could we schedule a viewing\?/g;
jiggy
źródło
6

Ilekroć masz znany wzorzec (tj. Nie używasz zmiennej do budowy wyrażenia regularnego), użyj dosłownej notacji wyrażenia regularnego, w której wystarczy użyć pojedynczych odwrotnych ukośników, aby uniknąć specjalnych metaznaków wyrażenia regularnego:

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

Ilekroć potrzebujesz dynamicznie zbudować RegExp, użyj RegExpnotacji konstruktora, w której MUSISZ podwójny ukośnik odwrotny, aby oznaczyć dosłowny ukośnik odwrotny :

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

A jeśli użyjesz String.rawliterału ciągu, którego możesz użyć w \takiej postaci, w jakiej jest (zobacz przykład użycia literału ciągu szablonu, w którym możesz umieścić zmienne we wzorcu wyrażenia regularnego):

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

Koniecznie przeczytaj: RegExp: Opis w MDN.

Wiktor Stribiżew
źródło