43

JSON.stringifyだから、私はそれがRegExpを空のオブジェクトに減らすことを見つけることに興味がありました-リテラル(フィドル):

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

この動作は予想されますか?RegExpは、シリアル化するプロパティのないオブジェクトであることに気付きました。とはいえ、日付もオブジェクトです。それでもJSON.stringify()、意味のある文字列を生成することができます。

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

JSONが。を使用してRegExpに同じ考慮事項を与えることを期待していました。RegExp.prototype.toString()

4

6 に答える 6

47

誰かが興味を持っている場合は、良い回避策があります。私は、現在の振る舞いが正しいとは思いません。たとえば、Dateインスタンスはのような空のオブジェクトにシリアル化されませんがRegExpobjectJSON表現はありません。

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"}"
于 2014-03-21T23:08:05.033 に答える
37

JSON.stringifyJSON.parseはどちらも、replacerとreviver引数を使用して、カスタムのシリアル化と逆シリアル化を行うようにカスタマイズできます。

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));

独自のシリアル化形式を考え出す必要があります。

于 2015-10-29T14:16:31.997 に答える
29

はい、JSONにはRegExpオブジェクトの正規表現がないためです。したがって、それは単なる空のオブジェクトです。

編集—さて、今は2018年です。などを使用したソリューションを提案する回答.toJSON()はおそらく問題ありませんが、プロトタイプにメソッドを追加します

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

等々。これにより、関数名が列挙できないようになり、モンキーパッチがやや衛生的になります。

于 2012-08-22T14:59:12.860 に答える
8

この問題を解決した方法は次のとおりです。

文字列としてシリアル化します。

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

次に、別の正規表現を使用して水分を補給します。

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

パターンとフラグを保持します-これが誰かに役立つことを願っています!

于 2015-11-11T00:52:38.183 に答える
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)
于 2014-10-03T07:27:17.500 に答える
4

良いアプローチは次のようなものだと思います。

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"}
于 2016-07-07T17:09:36.803 に答える