如何从 JavaScript 中的字符串表示形式创建 RegExp?
How to create a RegExp from its string representation in JavaScript?
我有一个包含文字表示法的正则表达式的字符串,例如:
var pattern = '/abc/i';
如何从该字符串创建正则表达式对象?
当然,我可以只使用 eval
:
eval(pattern); // /abc/i
但我想避免这种情况。
我刚刚为此创建了一个函数。检查一下。
- 从 1(避免第一个
/
)到 /
的最后一个索引的子字符串。 -> 我们得到了 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
您可以像这样使用 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);
你或许可以这样做:
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
如果您希望按字面意思处理特殊的正则表达式元字符,您可能需要添加对这些字符的处理。
我有一个包含文字表示法的正则表达式的字符串,例如:
var pattern = '/abc/i';
如何从该字符串创建正则表达式对象?
当然,我可以只使用 eval
:
eval(pattern); // /abc/i
但我想避免这种情况。
我刚刚为此创建了一个函数。检查一下。
- 从 1(避免第一个
/
)到/
的最后一个索引的子字符串。 -> 我们得到了 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
您可以像这样使用 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);
你或许可以这样做:
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
如果您希望按字面意思处理特殊的正则表达式元字符,您可能需要添加对这些字符的处理。