如何将正则表达式转换为String文字并再次返回?

use*_*193 7 javascript regex

我怎么能够:

  1. 将带有标志的JavaScript RegExp转换为String文字(想想JSON),
  2. 并将该文字转换回正则表达式?

例如使用String "the weather is nice today":

var myRe = new RegExp("weather","gi");
var myReToString = myRe.toString(); // myReToString is now "/weather/gi"

var myReCopy = /* How to get this copy only from myReToString ? */
Run Code Online (Sandbox Code Playgroud)

要修改原始的RegExp属性,请参阅torazaburo的答案.

小智 5

看看RegExp原型上的访问器属性,例如sourceflags.所以你可以这样做:

var myRe = new RegExp("weather", "gi")

var copyRe = new RegExp(myRe.source, myRe.flags); 
Run Code Online (Sandbox Code Playgroud)

有关规范,请参阅http://www.ecma-international.org/ecma-262/6.0/#sec-get-regexp.prototype.flags.

序列化和反序列化正则表达式

如果您这样做的目的是序列化正则表达式,例如进入JSON,然后反序列化它,我建议将正则表达式存储为元组[source, flags],然后使用重构它new RexExp(source, flags).这似乎比尝试使用regexp或eval'分开它更清晰.例如,您可以将其字符串化为

function stringifyWithRegexp(o) {
  return JSON.stringify(o, function replacer(key, value) {
    if (value instanceof RegExp) return [value.source, value.flags];
    return value;
  });
}
Run Code Online (Sandbox Code Playgroud)

在回来的路上你可以使用JSON.parsereviver来恢复正则表达式.

修改regexp

如果要在保留标志的同时修改正则表达式,可以使用修改后的源和相同的标志创建新的正则表达式:

var re = /weather/gim;
var newre = new RegExp(re.source + "| is", re.flags);
Run Code Online (Sandbox Code Playgroud)

  • 因此向OP提出他/她需要这样做的问题.也许有更好的东西可以解决根本问题:) (4认同)
  • 重点是您无法访问原始正则表达式. (3认同)
  • 没问题.只是提醒一下,我会避免使用eval(谷歌的'javascript evil eval',你会看到很多文章),但只要[你知道你在处理什么]它应该没问题(http: //stackoverflow.com/questions/197769/when-is-javascripts-eval-not-evil). (3认同)
  • *"又回来?"*表示来自一个字符串.步骤1的输出是步骤2的输入. (2认同)