【问题标题】:Stringifying a regular expression?字符串化正则表达式?
【发布时间】:2013-12-15 02:31:56
【问题描述】:

当然,JSON 不支持 Regex 文字。

所以,

JSON.stringify(/foo/)

给予:

{ }

有什么解决方法吗?

【问题讨论】:

    标签: javascript regex json


    【解决方案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,从未注意到。
      猜你喜欢
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 2019-08-14
      相关资源
      最近更新 更多