正则表达式的序列化(Serialization of RegExp)

2019-06-27 06:10发布

所以,我很感兴趣地发现, JSON.stringify降低了正则表达式来一个空对象字面( 小提琴 ):

JSON.stringify(/^[0-9]+$/) // "{}"

这种行为是正常吗? 我认识到,一个RegExp是没有属性序列化的对象。 这就是说,日期为对象了; 但JSON.stringify()管理,以产生一个有意义的字符串:

JSON.stringify(new Date) // "2014-07-03T13:42:47.905Z"

我本来希望JSON会给正则表达式同样的考虑使用RegExp.prototype. toString() RegExp.prototype. toString()

Answer 1:

是的,因为有在JSON RegExp对象不规范的表示。 因此,它只是一个空的对象。

编辑 -以及它现在2018; 建议使用解决方案的答案.toJSON()等可能是罚款,但我的方法添加到原型

Object.defineProperty(RegExp.prototype, "toJSON", {
  value: RegExp.prototype.toString
});

等等。 这可确保功能名称不枚举,这使得猴子补丁有些更卫生。



Answer 2:

如果有人有兴趣,有一个很好的解决方法。 我不认为,电流的行为是正确的。 例如, Date实例不是序列化到像空对象RegExp ,但它是一个object ,也没有JSON表示。

RegExp.prototype.toJSON = RegExp.prototype.toString;


// sample
var foo = { rgx: /qux$/ig, date: new Date }

JSON.stringify(foo);
//> {"rgx":"/qux$/gi","date":"2014-03-21T23:11:33.749Z"}"


Answer 3:

无论JSON.stringify和JSON.parse可定制通过做自定义序列化和反序列化replacer和齐磊参数。

 var o = { foo: "bar", re: /foo/gi }; function replacer(key, value) { if (value instanceof RegExp) return ("__REGEXP " + value.toString()); else return value; } function reviver(key, value) { if (value.toString().indexOf("__REGEXP ") == 0) { var m = value.split("__REGEXP ")[1].match(/\/(.*)\/(.*)?/); return new RegExp(m[1], m[2] || ""); } else return value; } console.log(JSON.parse(JSON.stringify(o, replacer, 2), reviver)); 

你只需要拿出自己的序列化格式。



Answer 4:

RegExp.prototype.toJSON = RegExp.prototype.toString;

var regexp = /^[0-9]+$/;
var foo = { rgx: regexp.source, date: new Date };
var stringified = JSON.stringify(foo);
new RegExp(JSON.parse(stringified).rgx)


Answer 5:

以下是我解决了这个问题:

序列化作为一个字符串:

var pattern = /foobar/i;
var serialized = JSON.stringify(pattern.toString());

然后,使用另一个正则表达式补充水分吧:

var fragments = serialized.match(/\/(.*?)\/([gimy])?$/);
var rehydrated = new RegExp(fragments[1], fragments[2] || '');

保留图案和标志 - 希望这可以帮助别人!



Answer 6:

我认为一个好的办法是这样的:

function stringifyFilter(key,value) {
    if (value instanceof RegExp) {
        return value.toString();
    }

    return value;
}

var myObj = {
    text : 'Howdy ho!',
    pattern : /[a-z]+/i
}

JSON.stringify(myObj,stringifyFilter); // output: {"text":"Howdy ho!","pattern":"/[a-z]+/i"}


文章来源: Serialization of RegExp