entkommendes Fragezeichen in Regex-Javascript

84

Dies ist eine einfache Frage, denke ich.

Ich versuche, mithilfe von Regex in JavaScript nach dem Vorkommen eines Strings in einem anderen String zu suchen:

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

Das funktioniert wegen des ?Charakters nicht ... Ich habe versucht, ihm zu entkommen \, aber das funktioniert auch nicht. Gibt es eine andere Möglichkeit, ?buchstäblich statt als Sonderzeichen zu verwenden?

Andrew
quelle
Das Schlimmste daran ist, dass selbst die Verwendung eines Strings anstelle eines regulären Ausdrucks dieses Problem verursacht, z. B. str.search("?")Das scheint definitiv ein Fehler zu sein, da dies kein regulärer Ausdruck ist und nicht als Eins behandelt werden sollte. 🤦
Synetech

Antworten:

24

Sie sollten einen doppelten Schrägstrich verwenden:

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

Warum? da in JavaScript das \auch verwendet wird, um Zeichen in Zeichenfolgen zu maskieren, also: "\?" wird:"?"

Und "\\?"wird "\?"

Christian C. Salvadó
quelle
16

Sie können Ihren regulären Ausdruck mit Schrägstrichen anstelle von Anführungszeichen und einem einzelnen Backslash abgrenzen, um das Fragezeichen zu umgehen. Versuche dies:

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

Wenn Sie ein bekanntes Muster haben (dh Sie verwenden keine Variable zum Erstellen eines RegExp), verwenden Sie die Literal- Regex-Notation, bei der Sie nur einzelne Backslashes verwenden müssen, um speziellen Regex-Metazeichen zu entgehen:

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

Wenn Sie ein RegExp dynamisch erstellen müssen, verwenden Sie die RegExpKonstruktornotation, bei der Sie Backslashes verdoppeln MÜSSEN, damit sie einen wörtlichen Backslash bezeichnen :

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

Und wenn Sie das String.rawZeichenfolgenliteral verwenden, können Sie es unverändert verwenden \(siehe ein Beispiel für die Verwendung eines Vorlagenzeichenfolgenliterals, in dem Sie Variablen in das Regex-Muster einfügen können):

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

Ein Muss: RegExp: Beschreibung bei MDN.

Wiktor Stribiżew
quelle