将RegExp转换为String然后再返回RegExp

时间:2016-08-25 20:30:30

标签: javascript regex

所以我有一个RegExp regex = /asd/

我将它存储为我的key-val商店系统中的密钥。

所以我说str = String(regex)返回"/asd/"

现在我需要将该字符串转换回RegExp。

所以我尝试:RegExp(str),我看到/\/asd\//

这不是我想要的。它与/asd/

不同

我应该在将字符串转换为正则表达式之前从字符串中删除第一个和最后一个字符吗?在这种情况下,这会让我获得理想的结果,但如果RegExp具有/i/g

等修饰符,则无法发挥作用

有更好的方法吗?

6 个答案:

答案 0 :(得分:26)

如果您不需要存储修饰符,可以使用Regexp#source获取字符串值,然后使用RegExp构造函数进行转换。

var regex = /abc/g;
var str = regex.source; // "abc"
var restoreRegex = new RegExp(str, "g");

如果确实需要存储修饰符,请使用正则表达式来解析正则表达式:

var regex = /abc/g;
var str = regex.toString(); // "/abc/g"
var parts = /\/(.*)\/(.*)/.exec(str);
var restoredRegex = new RegExp(parts[1], parts[2]);

即使模式中包含/,这也会有效,因为.*是贪婪的,并且会前进到字符串中的最后一个/

如果需要考虑性能,请使用String#lastIndexOf使用常规字符串操作:

var regex = /abc/g;
var str = regex.toString(); // "/abc/g"
var lastSlash = str.lastIndexOf("/");
var restoredRegex = new RegExp(str.slice(1, lastSlash), str.slice(lastSlash + 1));

答案 1 :(得分:1)

您可以在存储正则表达式文字之前使用以下内容:

HTTPError: 502 Server Error: Bad Gateway

请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/source

示例:

(new RegExp(regex)).source

答案 2 :(得分:1)

let rx = RegExp.apply(RegExp, str.match(/\/(.*)\/(.*)/).slice(1));

@PegasusEpsilon答案的修改版本

答案 3 :(得分:1)

const regex = /asd/gi;

将RegExp转换为字符串

const obj = {flags: regex.flags, source: regex.source};
const string = JSON.stringify(obj);

然后返回到RegExp

const obj2 = JSON.parse(string);
const regex2 = new RegExp(obj2.source, obj2.flags);

需要ES6 +。

答案 4 :(得分:0)

firebase-messaging-sw.js

regex = /asd/; str = regex.source; 将" asd",避免任何斜线问题。

答案 5 :(得分:0)

StackOverflow再次节省了一天,感谢@ 4castle!我想将一些正则表达式规则存储在JS文件中,而另一些则存储在数据库中,将它们组合成一个对象数组,如下所示:

module.exports = {
    [SETTINGS.PRODUCTION_ENV]: [

        {
            "key": /<meta name="generator"[\s\S]*?>/gmi,
            "value": "",
            "regex": true
        },

        ...
    ]
}

然后,遍历每个环境的对象并将其应用于文本字符串。这是针对节点/ lambda项目的,所以我想使用ES6。我使用了@ 4castle的代码,进行了一些分解,最终得到了这个结果:

    let content = body;
    const regexString = replacement.key.toString();
    const regexParts = /\/(.*)\/(.*)/.exec(regexString);
    const {1: source, 2: flags} = regexParts;
    const regex = new RegExp(source, flags);
    content = content.replace(regex, replacement.value);
    
    return content;

请客!