首页 文章

将用户输入字符串转换为正则表达式

提问于
浏览
277

我正在设计一个HTML和JavaScript的正则表达式测试程序 . 用户将输入正则表达式,字符串,并通过单选按钮选择他们想要测试的功能(例如搜索,匹配,替换等),程序将在使用指定参数运行该功能时显示结果 . 当然会有额外的文本框用于替换等额外的参数 .

我的问题是从用户获取字符串并将其转换为正则表达式 . 如果我说他们不需要设置标志,例如 gi . 所以他们必须让 // 's around the expression, but how can I convert that string to a regex? It can'是一个文字,因为它是一个字符串,我不能将它传递给RegExp构造函数,因为它不是没有 // 的字符串 . 有没有其他方法可以将用户输入字符串转换为正则表达式?我是否必须使用 // 解析正则表达式的字符串和标志然后以另一种方式构造它?我应该让他们输入一个字符串,然后单独输入标志吗?

9 回答

  • 523

    由于早期的答案,这个块可以作为将可配置字符串应用于RegEx ...以过滤文本的通用解决方案:

    var permittedChars = '^a-z0-9 _,.?!@+<>';
    permittedChars = '[' + permittedChars + ']';
    
    var flags = 'gi';
    var strFilterRegEx = new RegExp(permittedChars, flags);
    
    log.debug ('strFilterRegEx: ' + strFilterRegEx);
    
    strVal = strVal.replace(strFilterRegEx, '');
    // this replaces hard code solt:
    // strVal = strVal.replace(/[^a-z0-9 _,.?!@+]/ig, '');
    
  • 2

    使用RegExp object constructor从字符串创建正则表达式:

    var re = new RegExp("a|b", "i");
    // same as
    var re = /a|b/i;
    
  • 9
    var flags = inputstring.replace(/.*\/([gimy]*)$/, '$1');
    var pattern = inputstring.replace(new RegExp('^/(.*?)/'+flags+'$'), '$1');
    var regex = new RegExp(pattern, flags);
    

    要么

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

    使用JavaScript RegExp object constructor .

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

    您可以将标志作为第二个字符串参数传递给构造函数 . 有关详细信息,请参阅文档

  • 11

    这是一个单行: str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&')

    我是从escape-string-regexp NPM模块得到的 .

    尝试一下:

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

    在我的情况下,用户输入的somethimes被分隔符所束缚,有时则不然 . 因此我添加了另一个案例..

    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);
    }
    
  • 12

    我建议你也为特殊标志添加单独的复选框或文本字段 . 这样很明显,用户不需要添加任何 // . 在替换的情况下,提供两个文本字段 . 这将使您的生活更轻松 .

    为什么?因为否则一些用户会添加 // 而其他用户则不会 . 有些人会出现语法错误 . 然后,在你剥离了 // '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'的观点之后) .

  • 2

    当字符串无效或不包含标志等时,这也会起作用:

    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'));
    
  • 59

    您可以使用复选框请求标志,然后执行以下操作:

    var userInput = formInput;
    var flags = '';
    if(formGlobalCheckboxChecked) flags += 'g';
    if(formCaseICheckboxChecked) flags += 'i';
    var reg = new RegExp(userInput, flags);
    

相关问题