416 Stimmen

Umwandlung der Benutzereingabe in einen regulären Ausdruck

Ich entwickle ein Prüfprogramm für reguläre Ausdrücke in HTML und JavaScript. Der Benutzer gibt einen Regex, eine Zeichenkette, ein und wählt die Funktion, mit der er testen möchte (z.B. Suchen, Vergleichen, Ersetzen, etc.) per Radiobutton und 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 zusätzlichen Argumente zum Ersetzen und so weiter.

Mein Problem ist es, die Zeichenfolge vom Benutzer zu erhalten und sie in einen regulären Ausdruck zu verwandeln. Wenn ich sage, dass sie nicht brauchen, um zu haben // um den eingegebenen Regex herum, dann können sie keine Flags setzen, wie g y i . Sie müssen also über die // um den Ausdruck herum, aber wie kann ich diese Zeichenfolge in einen Regex umwandeln? Sie kann kein Literal sein, da sie eine Zeichenkette ist, und ich kann sie nicht an den RegExp-Konstruktor übergeben, da sie keine Zeichenkette ohne das // 's. Gibt es eine andere Möglichkeit, eine Benutzereingabe in eine Regex zu verwandeln? Muss ich die Zeichenkette und die Flags der Regex mit dem // Wie kann man sie dann anders konstruieren? Sollte ich sie eine Zeichenkette eingeben lassen und dann die Flaggen separat eingeben?

719voto

Gumbo Punkte 617646

Verwenden Sie die RegExp-Objekt-Konstruktor um einen regulären Ausdruck aus einer Zeichenkette zu erstellen:

var re = new RegExp("a|b", "i");
// same as
var re = /a|b/i;

83voto

Anonymous Punkte 45953
var flags = inputstring.replace(/.*\/([gimy]*)$/, '$1');
var pattern = inputstring.replace(new RegExp('^/(.*?)/'+flags+'$'), '$1');
var regex = new RegExp(pattern, flags);

ou

var match = inputstring.match(new RegExp('^/(.*?)/([gimy]*)$'));
// sanity check here
var regex = new RegExp(match[1], match[2]);

35voto

Rivenfall Punkte 1035

Hier ist ein Einzeiler: str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&')

Ich habe es von der escape-string-regexp NPM-Modul.

Probieren Sie es aus:

escapeStringRegExp.matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
function escapeStringRegExp(str) {
    return str.replace(escapeStringRegExp.matchOperatorsRe, '\\$&');
}

console.log(new RegExp(escapeStringRegExp('example.com')));
// => /example\.com/

Verwendung von getaggten Vorlagenliteralen mit Unterstützung von Flags:

function str2reg(flags = 'u') {
    return (...args) => new RegExp(escapeStringRegExp(evalTemplate(...args))
        , flags)
}

function evalTemplate(strings, ...values) {
    let i = 0
    return strings.reduce((str, string) => `${str}${string}${
        i < values.length ? values[i++] : ''}`, '')
}

console.log(str2reg()`example.com`)
// => /example\.com/u

19voto

Ayman Hourieh Punkte 122012

Verwenden Sie die JavaScript RegExp-Objekt-Konstruktor .

var re = new RegExp("\\w+");
re.test("hello");

Sie können Flags als zweites String-Argument an den Konstruktor übergeben. Siehe die Dokumentation für Details.

13voto

staabm Punkte 1495

In meinem Fall war die Benutzereingabe manchmal von Begrenzungszeichen umgeben und manchmal nicht, daher habe ich einen weiteren Fall hinzugefügt.

var regParts = inputstring.match(/^\/(.*?)\/([gim]*)$/);
if (regParts) {
    // the parsed pattern had delimiters and modifiers. handle them. 
    var regexp = new RegExp(regParts[1], regParts[2]);
} else {
    // we got pattern string without delimiters
    var regexp = new RegExp(inputstring);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X