所以我有一个RegExp regex = /asd/
我将它存储为我的key-val商店系统中的密钥。
所以我说str = String(regex)
返回"/asd/"
。
现在我需要将该字符串转换回RegExp。
所以我尝试:RegExp(str)
,我看到/\/asd\//
这不是我想要的。它与/asd/
我应该在将字符串转换为正则表达式之前从字符串中删除第一个和最后一个字符吗?在这种情况下,这会让我获得理想的结果,但如果RegExp具有/i
或/g
有更好的方法吗?
答案 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;
const obj = {flags: regex.flags, source: regex.source};
const string = JSON.stringify(obj);
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;
请客!