我有一个包含正则表达式的字符串,例如:
var pattern = '/abc/i';
如何从该字符串创建正则表达式对象?
当然,我可以使用eval
:
eval(pattern); // /abc/i
但我想避免这种情况。
答案 0 :(得分:2)
我刚为此创建了一个函数。检查一下。
/
)到最后一个索引/
)。 - >我们得到了pattenr。/
+1的最后一个索引到字符串长度的子字符串 - >得到了旗帜然后将2个参数传递给new RegExp
函数
function formRegEx(str){
var reg=str.substring(1,str.lastIndexOf('/'));
var flags=str.substring(str.lastIndexOf('/')+1,str.length);
return new RegExp(reg,flags);
}
console.log(formRegEx('/abc/i'));
console.log(formRegEx('/[a-zA-Z]/ig'));

根据OP对问题的评论,abc/i
可能会出现哪些应被视为无效。
因此,可以进行测试以检查有效性
/^\/.*\/[igm]*$/
然后通过测试
检查是否存在//
/[^\\]\/[^igm]/
上述功能可以改写为
function formRegEx(str){
if(!/^\/.*\/[igm]*$/.test(str)) return "Invalid RE";
if(/[^\\]\/[^igm]/.test(str)) return "Invalid RE";
var reg=str.substring(1,str.lastIndexOf('/'));
var flags=str.substring(str.lastIndexOf('/')+1,str.length);
return new RegExp(reg,flags);
}
console.log(formRegEx('/abc/ig')); // true
console.log(formRegEx('/abc//i')); // false
console.log(formRegEx('/a/bc/i')); //false
console.log(formRegEx('/[a-zA-Z]/ig')); // true
console.log(formRegEx('abc/ig')); // invalid
console.log(formRegEx('abci')); // invalid
console.log(formRegEx('/abc/ik')); // invalid

答案 1 :(得分:2)
您可以使用substr
和lastIndexOf
这样的组合:
var pattern = '/abc/i';
// the index of the first "/" is always 1
var index = pattern.lastIndexOf('/'); // index of the last "/"
var thePattern = pattern.substr(1, index - 1); // the actual pattern part
var theFlags = pattern.substr(index + 1); // the flags part
var regex = new RegExp(thePattern, theFlags);
console.log(regex);
答案 2 :(得分:2)
你可以这样做:
var pattern = '/ab*c/gi';
if ((m = /^\/(.*)\/([gim]*)$/i.exec(pattern)) != null) {
restr = m[1], flag = m[2], re = new RegExp(restr, flag)
}
//=> /ab*c/gi
如果您希望对它们进行字面处理,则可能需要添加特殊正则表达式元字符的处理。