所以我有一个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)
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+。
归档时间: |
|
查看次数: |
13968 次 |
最近记录: |