字符串化正则表达式?
Posted
技术标签:
【中文标题】字符串化正则表达式?【英文标题】:Stringifying a regular expression? 【发布时间】:2013-12-15 02:31:56 【问题描述】:当然,JSON 不支持 Regex 文字。
所以,
JSON.stringify(/foo/)
给予:
有什么解决方法吗?
【问题讨论】:
【参考方案1】:我认为这是你能得到的最接近的:
RegExp.prototype.toJSON = function() return this.source; ;
JSON.stringify( re: /foo/ ); // "re": "foo"
【讨论】:
+1,除了它不给你修饰符。您需要使用+ (this.global ? "g" : "")
等添加。
@BlueSkies 说了什么。 :) 或者你可以使用.toString
,我相信它会给你一切。这个想法只是为了演示如何强制 RegExps 能够自行使用 JSON。
使用替换函数是否比修改RegExp.prototype
(和破坏封装)更好?
这是更清洁的 IMO。不幸的是必须测试每个值,以防万一那里有正则表达式,而它可以避免。这就是他们给我们.toJSON
选项的原因。
@BlueSkies,我想这取决于它应该运行的代码的位置。如果只是在某人自己的网站上进行一次性交易,那么修改全局原型很好,但如果它是可移植的,那么它可能不太好(想想prototype.js)【参考方案2】:
您可以传递一个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 的实例
@Dagg:我不知道这个问题,所以我不知道。
@DaggNabbit:那是typeof
,在旧版 Chrome 中。
@BlueSkies,可能就是这样,虽然我很确定 Safari 是我正在考虑的案件的罪魁祸首。
@DaggNabbit Safari 11+ 为 /foo/ instanceof RegExp
返回 true【参考方案3】:
虽然 javascript 对象允许您将正则表达式作为值,但 JSON 不允许,因为它只存储数据,而不是代码。
作为一种解决方法,您可以使用 toString()
方法将正则表达式转换为字符串。
var str = /([a-z]+)/.toString(); // "/([a-z]+)/"
【讨论】:
【参考方案4】:您可以使用replacer 函数:
JSON.stringify(/foo/,
function(k, v)
if (v && v.exec == RegExp.prototype.exec) return '' + v;
else return v;
)
【讨论】:
这还不够测试。它会用真实的.source
属性弄乱任何其他对象。而且您没有提供默认返回值。
差不多。您需要确保v
不是null
或undefined
。 ;)
伙计,你在这上面。又修了。并且 TIL JSON.stringify 将 undefined 转换为 null,从未注意到。以上是关于字符串化正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章