【发布时间】:2013-12-15 02:31:56
【问题描述】:
当然,JSON 不支持 Regex 文字。
所以,
JSON.stringify(/foo/)
给予:
{ }
有什么解决方法吗?
【问题讨论】:
标签: javascript regex json
当然,JSON 不支持 Regex 文字。
所以,
JSON.stringify(/foo/)
给予:
{ }
有什么解决方法吗?
【问题讨论】:
标签: javascript regex json
我认为这是你能得到的最接近的:
RegExp.prototype.toJSON = function() { return this.source; };
JSON.stringify({ re: /foo/ }); // { "re": "foo" }
【讨论】:
+ (this.global ? "g" : "") 等添加。
.toString,我相信它会给你一切。这个想法只是为了演示如何强制 RegExps 能够自行使用 JSON。
RegExp.prototype(和破坏封装)更好?
.toJSON选项的原因。
您可以传递一个custom replacer function to JSON.stringify 并将正则表达式转换为字符串(假设表达式是数组或对象的一部分):
JSON.stringify(value, function(key, value) {
if (value instanceof RegExp) {
return value.toString();
}
return value;
});
如果您实际上不想/不需要创建 JSON,只需调用表达式的 toString() 方法即可。
【讨论】:
instanceof RegExp 现在工作可靠吗?一些浏览器曾经将正则表达式视为 Function IIRC 的实例
typeof,在旧版 Chrome 中。
/foo/ instanceof RegExp 返回 true
虽然 JavaScript 对象允许您将正则表达式作为值,但 JSON 不允许,因为它只存储数据,而不是代码。
作为一种解决方法,您可以使用 toString() 方法将正则表达式转换为字符串。
var str = /([a-z]+)/.toString(); // "/([a-z]+)/"
【讨论】:
您可以使用replacer 函数:
JSON.stringify(/foo/,
function(k, v) {
if (v && v.exec == RegExp.prototype.exec) return '' + v;
else return v;
})
【讨论】:
.source 属性弄乱任何其他对象。而且您没有提供默认返回值。
v 不是null 或undefined。 ;)