だから、_JSON.stringify
_がRegExpを空のオブジェクトに減らすことを見つけることに興味がありました-リテラル( fiddle ):
_JSON.stringify(/^[0-9]+$/) // "{}"
_
この動作は予想されますか? RegExpは、シリアル化するプロパティのないオブジェクトであることがわかりました。とはいえ、日付もオブジェクトです。それでも、JSON.stringify()
は意味のある文字列を生成することができます。
_JSON.stringify(new Date) // "2014-07-03T13:42:47.905Z"
_
JSONがRegExp.prototype.toString()
を使用して、RegExpに同じ考慮事項を与えることを望んでいました。
はい、JSONにはRegExpオブジェクトの正規表現がないためです。したがって、それは単なる空のオブジェクトです。
編集 —今は2018年です。 .toJSON()
などを使用した解決策を提案する回答はおそらく問題ありませんが、プロトタイプにメソッドを追加します。
Object.defineProperty(RegExp.prototype, "toJSON", {
value: RegExp.prototype.toString
});
等々。これにより、関数名が列挙できないようになり、モンキーパッチがやや衛生的になります。
誰かが興味を持っている場合は、素敵な回避策があります。私は、現在の行動が正しいとは思いません。たとえば、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"}"
JSON.stringify と JSON.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));
独自のシリアル化形式を考え出す必要があります。
この問題を解決した方法は次のとおりです。
文字列としてシリアル化します。
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] || '');
パターンとフラグを保持します-これが誰かに役立つことを願っています!
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)
良いアプローチは次のようなものだと思います。
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"}