How to check if the input string is a valid Regular expression?

前端 未结 5 686
北荒
北荒 2020-12-08 13:07

How do you check, in JavaScript, if a string is a proper regular expression that will compile?

For example, when you execute the following javascript, it produces a

相关标签:
5条回答
  • 2020-12-08 13:19

    this function could handle the '/' char as a normal char in regex, and also consider escaping when is a common string. it will always return an Regex, null if not a good regex string.

    function getRegex(regex) {
        try {
            regex = regex.trim();
            let parts = regex.split('/');
            if(regex[0] !== '/' || parts.length< 3){
              regex = regex.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); //escap common string
              return new RegExp(regex);
            }
    
            const option =parts[parts.length - 1];
            const lastIndex = regex.lastIndexOf('/');
            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])

    0 讨论(0)
  • 2020-12-08 13:22

    The question is solved, but if someone needs to define is the string either valid RegExp or not a RegExp at all.

    You can use new Function() and templating inside of the function body with try ... catch and new RegExp() as mentioned earlier.

    There is a snippet with the explanations:

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

    0 讨论(0)
  • 2020-12-08 13:36

    Here is a little function that checks the validity of both types of regexes, strings or patterns:

    function validateRegex(pattern) {
        var parts = pattern.split('/'),
            regex = pattern,
            options = "";
        if (parts.length > 1) {
            regex = parts[1];
            options = parts[2];
        }
        try {
            new RegExp(regex, options);
            return true;
        }
        catch(e) {
            return false;
        }
    }
    

    The user will be able to test both test and /test/g for example. Here is a working fiddle.

    0 讨论(0)
  • 2020-12-08 13:36
    function isRegExp(regExp){
              try {
                    new RegExp(regExp);
                  } catch(e) {
                    return false
                  }
             return true
        }
    
    ex:
    isRegExp(/@(\w+)/g) = true
    
    0 讨论(0)
  • 2020-12-08 13:42

    You can use try/catch and the RegExp constructor:

    var isValid = true;
    try {
        new RegExp("the_regex_to_test_goes_here");
    } catch(e) {
        isValid = false;
    }
    
    if(!isValid) alert("Invalid regular expression");
    
    0 讨论(0)
提交回复
热议问题