字符串化正则表达式?

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 不是nullundefined。 ;) 伙计,你在这上面。又修了。并且 TIL JSON.stringify 将 undefined 转换为 null,从未注意到。

以上是关于字符串化正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章

带正则表达式的参数化 SQL、ORACLE 与 SQL Server

printf 格式字符串的 正则化表达式

正则表达式(基于JavaScript)

正则表达式(基于JavaScript)

javascript正则表达式

正则表达式字符匹配