Wie überprüfe ich, ob die Eingabezeichenfolge ein gültiger regulärer Ausdruck ist?
Lesezeit: 6 Minuten
Jak Samun
Wie prüft man in JavaScript, ob ein String ein richtiger regulärer Ausdruck ist, der sich kompilieren lässt?
Wenn Sie beispielsweise das folgende Javascript ausführen, erzeugt es einen Fehler.
var regex = new RegExp('abc ([a-z]+) ([a-z]+))');
// produces:
// Uncaught SyntaxError: Invalid regular expression: /abc ([a-z]+) ([a-z]+))/: Unmatched ')'
Wie stellt man fest, ob ein String eine gültige Regex ist oder nicht?
Sie brauchen eine Regex, um eine Regex zu testen? lol
– Niccolò Campolungo
22. Juni 2013 um 12:41 Uhr
Bitte geben Sie Ihren Code deutlich an, wir helfen Ihnen weiter
– Ganesh Rengarajan
22. Juni 2013 um 12:43 Uhr
Ich möchte überprüfen, ob die Eingabezeichenfolge ein gültiger regulärer Ausdruck ist oder nicht
– Jak Samun
22. Juni 2013 um 12:49 Uhr
Warum ist dies “keine echte Frage” oder “geschlossen”? Oder negatives Feedback? Ich habe hier meine Antwort gefunden, mit genau dem beschriebenen Problem!
– Florian Mertens
26. September 2014 um 14:38 Uhr
Genau … es sei denn, es wurde bearbeitet, an dieser Frage ist nichts vage – gültige Ausdrücke sind diejenigen, die kompiliert werden. Da wir hier von Javascript sprechen, macht es nur Sinn anzunehmen, dass damit ES-Ausdrücke gemeint sind.
– Fluss
10. November 2015 um 14:48 Uhr
Jon
Sie können verwenden try/catch und die RegExp Konstrukteur:
var isValid = true;
try {
new RegExp("the_regex_to_test_goes_here");
} catch(e) {
isValid = false;
}
if(!isValid) alert("Invalid regular expression");
@Jak: Wenn Sie weitere Informationen darüber bereitstellen, was genau “nicht funktioniert”, können wir Ihnen möglicherweise helfen. Aber nur zu sagen „das geht nicht“, bringt uns nichts. Welchen Eingang versuchst du? Welche Ausgabe erhalten Sie? Bekommst du einen anderen Fehler?
– Felix Klinge
22. Juni 2013 um 12:59 Uhr
Ich ersetze meinen Textfeldwert anstelle von the_regex_to_test_goes_here, aber es bestimmt nicht, ob der Textfeldwert gültig ist oder nicht. Reichen die Informationen meiner Frage jetzt aus?
– Jak Samun
22. Juni 2013 um 13:14 Uhr
@JakSamun: Posten Sie einen jsfiddle.com-Link mit dem, was Sie getan haben, und teilen Sie uns mit, inwiefern das Ergebnis anders war als erwartet.
– Jon
22. Juni 2013 um 13:15 Uhr
@DmitryDavydov, dass Regex technisch gesehen “korrekt” ist, obwohl es sehr verwirrend ist. Beachten Sie, dass das von Ihnen zitierte Verhalten ist POSIX-Standard (Die Sonderzeichen … verlieren innerhalb eines Klammerausdrucks ihre besondere Bedeutung).
– Jon
1. April 2016 um 9:06 Uhr
Funktioniert nicht in Chrome 63 – scheint jeden Wert im Konstruktor zu akzeptieren, ohne zu werfen.
– zweiblütig
25. Januar 2018 um 15:36 Uhr
Hier ist eine kleine Funktion, die die Gültigkeit beider Arten von regulären Ausdrücken, Zeichenfolgen oder Mustern überprüft:
function validateRegex(pattern) {
var parts = pattern.split("https://stackoverflow.com/"),
regex = pattern,
options = "";
if (parts.length > 1) {
regex = parts[1];
options = parts[2];
}
try {
new RegExp(regex, options);
return true;
}
catch(e) {
return false;
}
}
Der Benutzer kann beides testen test und /test/g zum Beispiel. Hier ist eine funktionierende Geige.
Diese Funktion lässt beliebige Zeichenfolgen zu, daher bin ich mir nicht sicher, ob dies das tut, was op will
– simon-pr
18. November 2016 um 22:54 Uhr
(Hast du abgelehnt? lol) Meine Antwort und die andere Antwort machen im Grunde genau dasselbe, mit der Ausnahme, dass ich auch mögliche Optionen innerhalb des Musters berücksichtige. Und um ehrlich zu sein, wollte OP nur “prüfen, ob die Eingabezeichenfolge eine gültige Regex ist oder nicht”; Es gab keine speziellen Einschränkungen für die Eingabelänge, sodass jede Zeichenfolge als Eingabe übergeben werden konnte. Außerdem tue ich genau das, was er verlangt hat, und gebe sogar den richtigen wahren oder falschen Wert zurück.
– Niccolò Campolungo
20. November 2016 um 8:58 Uhr
Sie berücksichtigen keine Regex mit einem / als Teil davon.
– Johanneske
7. Juni 2018 um 11:20 Uhr
Die Frage ist gelöst, aber wenn jemand definieren muss, ist die Zeichenfolge entweder gültig RegExp oder nicht a RegExp überhaupt.
Sie können verwenden new Function() und Templating innerhalb des Funktionskörpers mit try ... catch und new RegExp() wie bereits erwähnt.
Es gibt einen Ausschnitt mit den Erklärungen:
const isRegExp = (string) => {
try {
return new Function(`
"use strict";
try {
new RegExp(${string});
return true;
} catch (e) {
return false;
}
`)();
} catch(e) {
return false;
}
};
// Here the argument 'simplyString' shall be undefined inside of the function
// Function(...) catches the error and returns false
console.log('Is RegExp valid:', isRegExp('simplyString'));
// Here the argument shall cause a syntax error
// isRegExp function catches the error and returns false
console.log('Is RegExp valid:', isRegExp('string which is not a valid regexp'));
// Here the argument is not a valid RegExp, new RegExp(...) throws an error
// Function(...) catches the error and returns false
console.log('Is RegExp valid:', isRegExp('abc ([a-z]+) ([a-z]+))'));
// Valid RegExp, passed as a string
console.log('Is RegExp valid:', isRegExp('/^[^<>()[\]\\.,;:\s@\"]$/'));
// Valid RegExp, passed as a RegExp object
console.log('Is RegExp valid:', isRegExp(/^[^<>()[\]\\.,;:\s@\"]$/));
// Howewer, the code injection is possible here
console.log('Is RegExp valid:', isRegExp(');console.log("This is running inside of the Function(...) as well"'));
Diese Funktion könnte das Zeichen “https://stackoverflow.com/” als normales Zeichen in Regex behandeln und auch Escapezeichen in Betracht ziehen, wenn es sich um eine gemeinsame Zeichenfolge handelt. Es wird immer eine Regex zurückgegeben, null, wenn es sich nicht um eine gute Regex-Zeichenfolge handelt.
function getRegex(regex) {
try {
regex = regex.trim();
let parts = regex.split("https://stackoverflow.com/");
if(regex[0] !== "https://stackoverflow.com/" || parts.length< 3){
regex = regex.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); //escap common string
return new RegExp(regex);
}
const option =parts[parts.length - 1];
const lastIndex = regex.lastIndexOf("https://stackoverflow.com/");
regex = regex.substring(1, lastIndex);
return new RegExp(regex, option);
} catch (e) {
return null
}
}
console.log(getRegex('ab/c'))
let htmlStartTag = getRegex('/<(?!/)(?!br)(.+?)(?<!/)>/mgs');
console.log(htmlStartTag)
let result = `</button><input id="warehouse-search-field-tablet"
class="form-control search-field"
title="Warehouse Search Field" name="location" type="search" value="">content`.matchAll(htmlStartTag);
console.log([...result])
Tofandel
Keine der Antworten hier befriedigte mein Bedürfnis, zu überprüfen, ob eine Zeichenfolge eine gültige Regex für andere Sprachen (meistens PHP) ist, da sie entweder die Flags, die Trennzeichen oder Sonderzeichen ignorieren, also habe ich meine eigene Funktion erstellt
Sie brauchen eine Regex, um eine Regex zu testen? lol
– Niccolò Campolungo
22. Juni 2013 um 12:41 Uhr
Bitte geben Sie Ihren Code deutlich an, wir helfen Ihnen weiter
– Ganesh Rengarajan
22. Juni 2013 um 12:43 Uhr
Ich möchte überprüfen, ob die Eingabezeichenfolge ein gültiger regulärer Ausdruck ist oder nicht
– Jak Samun
22. Juni 2013 um 12:49 Uhr
Warum ist dies “keine echte Frage” oder “geschlossen”? Oder negatives Feedback? Ich habe hier meine Antwort gefunden, mit genau dem beschriebenen Problem!
– Florian Mertens
26. September 2014 um 14:38 Uhr
Genau … es sei denn, es wurde bearbeitet, an dieser Frage ist nichts vage – gültige Ausdrücke sind diejenigen, die kompiliert werden. Da wir hier von Javascript sprechen, macht es nur Sinn anzunehmen, dass damit ES-Ausdrücke gemeint sind.
– Fluss
10. November 2015 um 14:48 Uhr