【问题标题】:Parse json with regexextract使用正则表达式解析 json
【发布时间】:2020-10-09 22:04:05
【问题描述】:

你能帮我解析谷歌表格单元格中的一些 json 内容吗,我可以将第一个模式与正则表达式捕获组匹配,但不能匹配以下模式。我没有成功放置 /gmi 选项或从其他一些代码示例中调整我的案例,并且自 2 天以来我又在浪费时间。非常感谢

单元格中的 json : [{"idcode":"1AGLG";parent:"1A";level:"Genus";title:"Aglaonema";IsGroup:true};{"idcode":"1ALDG";parent:"1A";level: "属";title:"Alocasia";IsGroup:true};{"idcode":"1BBSG";parent:"1A";level:"属";title:"Ambrosina";IsGroup:true};{"idcode ":"1AMUG";parent:"1A";level:"Genus";title:"Amorphophallus";IsGroup:true}]

我的公式: REGEXEXTRACT(A1; """idcode"":""([\w]+)""(?:.*?title:"")([\w]+)""")

还有工作表文件:https://docs.google.com/spreadsheets/d/17YSCK2S8IeqFE_Y_kqWQLVwT9VONXkxvCY3Hlr-8Xpc/edit?usp=sharing

【问题讨论】:

    标签: json regex google-sheets


    【解决方案1】:

    这个示例公式怎么样?

    示例公式:

    =ARRAYFORMULA(TRIM(SPLIT(TRANSPOSE(SPLIT(REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(A1,"[\[{}\]]",""),"""idcode"":""([\w]+)""(?:.*?title:"")([\w]+)"";IsGroup:true;?","$1,$2,"),"(([\w\s\S]+?,){2})","$1@"),"@")),",")))
    
    • 在此示例公式中,[{"idcode":"1AGLG";parent:"1A";level:"Genus";title:"Aglaonema";IsGroup:true};{"idcode":"1ALDG";parent:"1A";level:"Genus";title:"Alocasia";IsGroup:true};{"idcode":"1BBSG";parent:"1A";level:"Genus";title:"Ambrosina";IsGroup:true};{"idcode":"1AMUG";parent:"1A";level:"Genus";title:"Amorphophallus";IsGroup:true}] 的值放在单元格“A1”中。
    • 这个公式的流程如下。
      1. 使用REGEXREPLACE 将原始值中的[\[{}\]] 替换为""
      2. 使用REGEXREPLACE 将第一个替换值中的""idcode"":""([\w]+)""(?:.*?title:"")([\w]+)"";IsGroup:true;? 替换为$1,$2,
      3. 将第二个替换值拆分为 2 列。

    结果:

    注意:

    • 作为其他方法,以下示例公式可以检索到与上述公式相同的结果。在这个公式中,SPLIT 使用了 2 次,分别使用了 @,

        =ARRAYFORMULA(SPLIT(TRANSPOSE(SPLIT(REGEXREPLACE(REGEXREPLACE(A1,"[\[{}\]]",""),"""idcode"":""([\w]+)""(?:.*?title:"")([\w]+)"";IsGroup:true;?","$1,$2@"),"@")),","))
      
    • 如果,@包含在原始值中,请更改上述公式。

    参考资料:

    【讨论】:

    • 非常感谢,你的第二个公式很有效(我第一个没有成功)
    【解决方案2】:

    也可以使用以下公式,其中我们使用 2 个捕获组与 REGEXREPLACE 结合 JOIN 函数, REGEXEXTRACT 以获得更多“灵活性” em>。

    在这两种情况下,ArrayFormulaSPLIT 函数都是必须的:

    作为单个单元格

    =ArrayFormula(JOIN(" / ",REGEXREPLACE(SPLIT($A1,"};{",0), 
                                             ".*(\d\D{2,5})"".*""(\D+)"".*$","$1 - $2")))
    

    在一个单独的单元格中

    ={ArrayFormula(REGEXEXTRACT(SPLIT($A1,"};{",0),"(\d\D{2,5})"""));
      ArrayFormula(REGEXEXTRACT(SPLIT($A1,"};{",0),".*""(\D+)"".*$"))}
    

    在单独的单元格中作为列表

    ={ArrayFormula(TRANSPOSE(REGEXEXTRACT(SPLIT($A1,"};{",0),"(\d\D{2,5})"""))),
      ArrayFormula(TRANSPOSE(REGEXEXTRACT(SPLIT($A1,"};{",0),".*""(\D+)"".*$")))}
    

    使用的功能:

    【讨论】:

    • 再次非常感谢 marikamitsos,您的公式完美运行,看起来很优雅。抱歉,我无法验证两次答案
    • Tanaike 的公式似乎不那么优雅,但它完全符合我想要的“”之间的内容。我会试着和你的混搭
    • ...我想要的“”。你想要什么?我认为它确实符合您的示例。如果您还有其他事情,请告诉我。
    • 使用 Tanaike 的公式,我可以使用“标志名称”指定查询(例如匹配“父”的以下单词,或者在另一个具有不同标志的 json 情况下)。我希望更精确,无论如何你们都帮助我解决了我的问题,请不要怪我,因为我无法验证2个解决方案..再次感谢你们
    • 用你原来的例子测试your formula后,它给了我wrong results。我错过了什么吗?还。你能给你的comment举个例子吗?
    【解决方案3】:

    我终于混合了两个公式,以指定目标标志并匹配它们后面的多个单词:

    =ARRAYFORMULA(join(" ; ";TRANSPOSE(SPLIT(REGEXREPLACE(REGEXREPLACE(A1;"[\[{}\]]";"");"""idcode"":""(\d\D{2,5})""(?:.*?title:"")(\D+)"";IsGroup:true;?";"$1
    = $2@");"@"))))
    

    【讨论】:

      【解决方案4】:

      在给定模式(这里是单词'parent')之后提取引号之间的任何内容(灵感来自marikamitsos

      =ArrayFormula(JOIN(" ; ";REGEXREPLACE(SPLIT($B20;"};{";0); 
                                               ".*(parent):""((.+?))"".*$";"$1 = $2")))
      

      【讨论】:

        【解决方案5】:

        按照 3 个给定模式(此处为 'flag1'、'parent'、'3rdFlag')提取括号之间的字符串

        json 文本示例:

        [{"flag1":"1AGLG";parent:"1A 是第二次检索";level:"Genus";3rdFlag:"Aglaonema 是我喜欢的方式"};{"flag1":"1ALDG" ;parent:"12A 2nd 检索";level:"Genus";3rdFlag:"Alocasia"};{"flag1":"1AOWG";parent:"BA 2nd 检索";level:"Genus";3rdFlag :"Anchomanes"};{"flag1":"1AUIG";parent:"1A 是第二次检索";level:"Genus";3rdFlag:"Anubias"};{"flag1":"1AQOG";parent:" 2CA 2nd to retrive";level:"Genus";3rdFlag:"Ariopsis at the end"}]

        公式:

        =ArrayFormula(JOIN(" ; ";REGEXREPLACE(SPLIT($B24;"};{";0); 
                                                 ".*(flag1"":""(.+?)"")(.+?)(parent:""(.+?)"")(.+?)(3rdFlag:""(.+?)"").*$";"$2 / $5 / $8")))
        

        结果:

        1AGLG / 1A 是第二次检索 / Aglaonema 是我喜欢的方式; 1ALDG / 12A 是第 2 检索 / Alocasia ; 1AOWG / BA 在检索 / Anchomanes 方面排名第二; 1AUIG / 1A 是第二次检索 / Anubias ; 1AQOG / 2CA 是第 2 次检索 / Ariopsis 在最后

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-08
          • 1970-01-01
          • 2015-06-19
          • 1970-01-01
          • 2016-08-19
          • 1970-01-01
          • 2015-07-08
          相关资源
          最近更新 更多