Wie überprüfe ich, ob die Eingabezeichenfolge ein gültiger regulärer Ausdruck ist?

Lesezeit: 6 Minuten

Benutzer-Avatar
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

Benutzer-Avatar
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])

Benutzer-Avatar
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

function isValidRegex(s) {
  try {
    const m = s.match(/^([/~@;%#'])(.*?)\1([gimsuy]*)$/);
    return m ? !!new RegExp(m[2],m[3])
        : false;
  } catch (e) {
    return false
  }
}

console.log(isValidRegex('abc')) //False
console.log(isValidRegex('/abc/')) //True
console.log(isValidRegex('/ab#\/[c]/ig')) //True
console.log(isValidRegex('@ab#\/[c]@ig')) //Special delimiters: True
console.log(isValidRegex('/ab\/[c/ig')) //False
console.log(isValidRegex('/abc/gig')) //False

Sie können diese Funktion auch ableiten, um einen String in ein RegExp-Objekt umzuwandeln

function stringToRegex(s) { const m = s.match(/^([/~@;%#'])(.*?)\1([gimsuy]*)$/);  m zurückgeben?  neue RegExp(m[2]m[3]) : neue RegExp(s);  } console.log(stringToRegex('abc')) console.log(stringToRegex('/abc/')) console.log(stringToRegex('/ab#\/[c]/ig')) console.log(stringToRegex('@ab#\/[c]@ig')) versuche { console.log(stringToRegex('/ab#\/[c/ig'))
} catch (e) {
  console.log('Not a valid regex')
}

user avatar
Rahul Shahare

function isRegExp(regExp){
          try {
                new RegExp(regExp);
              } catch(e) {
                return false
              }
         return true
    }

ex:
isRegExp(/@(\w+)/g) = true

1116710cookie-checkWie überprüfe ich, ob die Eingabezeichenfolge ein gültiger regulärer Ausdruck ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy