如何从JavaScript中的字符串表示创建一个RegExp?

时间:2017-04-04 10:39:49

标签: javascript regex literals

我有一个包含正则表达式的字符串,例如:

var pattern = '/abc/i';

如何从该字符串创建正则表达式对象?

当然,我可以使用eval

eval(pattern); // /abc/i

但我想避免这种情况。

3 个答案:

答案 0 :(得分:2)

我刚为此创建了一个函数。检查一下。

  • 子串从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




答案 1 :(得分:2)

您可以使用substrlastIndexOf这样的组合:

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

如果您希望对它们进行字面处理,则可能需要添加特殊正则表达式元字符的处理。