Converting user input string to regular expression

前端 未结 11 1827
无人及你
无人及你 2020-11-22 14:18

I am designing a regular expression tester in HTML and JavaScript. The user will enter a regex, a string, and choose the function they want to test with (e.g. search, match,

相关标签:
11条回答
  • 2020-11-22 14:20

    Here is a one-liner: str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&')

    I got it from the escape-string-regexp NPM module.

    Trying it out:

    escapeStringRegExp.matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
    function escapeStringRegExp(str) {
        return str.replace(escapeStringRegExp.matchOperatorsRe, '\\$&');
    }
    
    console.log(new RegExp(escapeStringRegExp('example.com')));
    // => /example\.com/
    

    Using tagged template literals with flags support:

    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
    
    0 讨论(0)
  • 2020-11-22 14:20

    This will work also when the string is invalid or does not contain flags etc:

    function regExpFromString(q) {
      let flags = q.replace(/.*\/([gimuy]*)$/, '$1');
      if (flags === q) flags = '';
      let pattern = (flags ? q.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1') : q);
      try { return new RegExp(pattern, flags); } catch (e) { return null; }
    }
    
    console.log(regExpFromString('\\bword\\b'));
    console.log(regExpFromString('\/\\bword\\b\/gi'));
                

    0 讨论(0)
  • 2020-11-22 14:28

    I suggest you also add separate checkboxes or a textfield for the special flags. That way it is clear that the user does not need to add any //'s. In the case of a replace, provide two textfields. This will make your life a lot easier.

    Why? Because otherwise some users will add //'s while other will not. And some will make a syntax error. Then, after you stripped the //'s, you may end up with a syntactically valid regex that is nothing like what the user intended, leading to strange behaviour (from the user's perspective).

    0 讨论(0)
  • 2020-11-22 14:29

    You can ask for flags using checkboxes then do something like this:

    var userInput = formInput;
    var flags = '';
    if(formGlobalCheckboxChecked) flags += 'g';
    if(formCaseICheckboxChecked) flags += 'i';
    var reg = new RegExp(userInput, flags);
    
    0 讨论(0)
  • 2020-11-22 14:30

    In my case the user input somethimes was sorrounded by delimiters and sometimes not. therefore I added another case..

    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);
    }
    
    0 讨论(0)
  • 2020-11-22 14:32

    I use eval to solve this problem.

    For example:

        function regex_exec() {
    
            // Important! Like @Samuel Faure mentioned, Eval on user input is a crazy security risk, so before use this method, please take care of the security risk. 
            var regex = $("#regex").val();
    
            // eval()
            var patt = eval(userInput);
    
            $("#result").val(patt.exec($("#textContent").val()));
        }
    
    0 讨论(0)
提交回复
热议问题