Ich entwerfe einen Tester für reguläre Ausdrücke in HTML und JavaScript. Der Benutzer gibt einen regulären Ausdruck und eine Zeichenfolge ein und wählt die Funktion, mit der er testen möchte (z. B. Suchen, Übereinstimmen, Ersetzen usw.), über das Optionsfeld aus. Das Programm zeigt die Ergebnisse an, wenn diese Funktion mit den angegebenen Argumenten ausgeführt wird. Natürlich gibt es zusätzliche Textfelder für die zu ersetzenden zusätzlichen Argumente und dergleichen.
Mein Problem besteht darin, die Zeichenfolge vom Benutzer abzurufen und in einen regulären Ausdruck umzuwandeln. Wenn ich sage, dass sie keine //
Regex-Zeichen haben müssen , die sie eingeben, können sie keine Flags wie g
und setzen i
. Sie müssen also das //
's um den Ausdruck haben, aber wie kann ich diesen String in einen regulären Ausdruck konvertieren? Es kann kein Literal sein, da es eine Zeichenfolge ist, und ich kann es nicht an den RegExp-Konstruktor übergeben, da es keine Zeichenfolge ohne die //
Zeichen ist. Gibt es eine andere Möglichkeit, eine Benutzereingabezeichenfolge in einen regulären Ausdruck zu verwandeln? Muss ich den String und die Flags der Regex mit den //
's analysieren und dann anders konstruieren? Soll ich sie eine Zeichenfolge eingeben lassen und dann die Flags separat eingeben?
quelle
var re = new RegExp("\\w+");
<input>
HTML-Tag befindet.var re = new RegExp("\"\\w+\"");
ist ein Beispiel für einen fest codierten regulären Ausdruck, der den RegExp-Konstruktor verwendet, und das Escapezeichen der doppelten Anführungszeichen ist erforderlich. Was ich mit einer Zeichenfolge in einer Variablen meine, ist, dass Sie dies problemlos tun könnenvar re = new RegExp(str);
undstr
doppelte Anführungszeichen oder Backslashes enthalten können.oder
quelle
/\/
erkannt wird.Hier ist ein Einzeiler:
str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&')
Ich habe es vom Escape-String-Regexp- NPM-Modul erhalten.
Probieren Sie es aus:
Verwenden von markierten Vorlagenliteralen mit Unterstützung für Flags:
quelle
Verwenden Sie den JavaScript RegExp-Objektkonstruktor .
Sie können Flags als zweites Zeichenfolgenargument an den Konstruktor übergeben. Einzelheiten finden Sie in der Dokumentation.
quelle
In meinem Fall war die Benutzereingabe manchmal von Trennzeichen umgeben und manchmal nicht. deshalb habe ich noch einen fall hinzugefügt ..
quelle
.split()
Funktion immer anstelle einer langen Regex-Zeichenfolge verwenden.regParts = inputstring.split('/')
Dies würderegParts[1]
die Regex-Zeichenfolge undregParts[2]
die Trennzeichen bilden (vorausgesetzt, das Setup der Regex ist/.../gim
). Sie können überprüfen, ob Trennzeichen mit vorhanden sindregParts[2].length < 0
.Ich schlage vor, dass Sie auch separate Kontrollkästchen oder ein Textfeld für die speziellen Flags hinzufügen. Auf diese Weise ist klar, dass der Benutzer keine hinzufügen muss
//
. Geben Sie im Falle eines Ersetzens zwei Textfelder an. Dies wird Ihr Leben viel einfacher machen.Warum? Weil sonst einige Benutzer
//
's hinzufügen , während andere nicht. Und einige machen einen Syntaxfehler. Nachdem Sie die//
s entfernt haben, erhalten Sie möglicherweise einen syntaktisch gültigen regulären Ausdruck, der nicht dem entspricht, was der Benutzer beabsichtigt hat, was zu seltsamem Verhalten führt (aus Sicht des Benutzers).quelle
Dies funktioniert auch, wenn die Zeichenfolge ungültig ist oder keine Flags usw. Enthält:
quelle
Wenn Sie eine Zeichenfolge wirklich in einen regulären Ausdruck konvertieren möchten, verwenden Sie die folgende Funktion:
Sie können es so verwenden:
Als Referenz ist hier die formatierte und modernere Version:
quelle
Dank früherer Antworten eignet sich dieser Block als allgemeine Lösung zum Anwenden einer konfigurierbaren Zeichenfolge in eine RegEx .. zum Filtern von Text:
quelle
Sie können mithilfe von Kontrollkästchen nach Flags fragen und dann Folgendes tun:
quelle
Ich benutze
eval
, um dieses Problem zu lösen.Zum Beispiel:
quelle