将RegExp转换为String然后返回RegExp

max*_*ner 29 javascript regex

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

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

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

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

所以我试试:RegExp(str)我明白了/\/asd\//

这不是我想要的.它不一样/asd/

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

有一个更好的方法吗?

4ca*_*tle 32

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

var regex = /abc/g;
var str = regex.source; // "abc"
var restoreRegex = new RegExp(str, "g");
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果需要考虑性能,请使用正常的字符串操作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));
Run Code Online (Sandbox Code Playgroud)

  • @ Xotic750如果`/`在正则表达式模式中,那将会失败 (3认同)
  • 我想也值得一提的是你可以做`var restoredRegex = eval(str);`但这样会慢一些,并且能够执行任意的JavaScript. (2认同)
  • 如此接近伟大 - `var restoredRegex = RegExp.apply(RegExp,str.match(/\/(.*)\/(.*)/)); (2认同)
  • 另一个问题:使用 `new RegExp('\n', 'g')` 给出的字符串结果与 `/\n/g` 不同。看起来反斜杠必须在字符串中转义。另外,我认为也可以使用 `var regex = /abc\n/g; var str = regex.source; var flags = regex.flags; var returnedRegex = new RegExp(str, flags);` -- 我认为这比字符串解析更干净。当然,它是_两个_字符串,而不是只有一个。 (2认同)

Pau*_*per 9

const regex = /asd/gi;
Run Code Online (Sandbox Code Playgroud)

将正则表达式转换为字符串

const obj = {flags: regex.flags, source: regex.source};
const string = JSON.stringify(obj);
Run Code Online (Sandbox Code Playgroud)

然后回到正则表达式

const obj2 = JSON.parse(string);
const regex2 = new RegExp(obj2.source, obj2.flags);
Run Code Online (Sandbox Code Playgroud)

需要 ES6+。