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

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

我的问题是从用户那里获取字符串并将其转换为正则表达式。如果我说他们不需要//在输入的正则表达式中包含,则他们不能设置标志,例如gi因此,它们必须//在表达式周围包含,但是如何将字符串转换为正则表达式?它不能是文字,因为它是一个字符串,我不能将其传递给RegExp构造函数,因为它不是没有//s 的字符串还有其他方法可以使用户输入字符串进入正则表达式吗?我是否必须使用来解析regex的字符串和标志,//然后以其他方式构造它?我应该让他们输入一个字符串,然后分别输入标志吗?

Tony凯2020/03/24 09:36:30

eval用来解决这个问题。

例如:

    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()));
    }
乐米亚2020/03/24 09:36:30

如果您确实要将字符串转换为正则表达式,请尝试使用以下函数:

function String2Regex(s){return new RegExp(s.match(/\/(.+)\/.*/)[1], s.match(/\/.+\/(.*)/)[1]);}

您可以这样使用它:

"abc".match(String2Regex("/a/g"))
> ["a"]

作为参考,这是格式化的和更现代的版本:

const String2Regex = str => {
  // Main regex
  const main = str.match(/\/(.+)\/.*/)[1]

  // Regex options
  const options = str.match(/\/.+\/(.*)/)[1]

  // Return compiled regex
  return new RegExp(main, options)
}
卡卡西Near2020/03/24 09:36:30

使用JavaScript RegExp对象构造函数

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

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

小卤蛋Tom2020/03/24 09:36:30

在我的情况下,用户输入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);
}
阳光阿飞2020/03/24 09:36:30

使用RegExp对象构造函数从字符串创建正则表达式:

var re = new RegExp("a|b", "i");
// same as
var re = /a|b/i;