一尘不染

用于解析单个键的正则表达式:JavaScript中的JSON值

json

我想看看是否有可能查找个人keys一出JSON字符串中的Javascript并返回它ValueRegex。有点像构建JSON搜索工具。

想象以下JSON

"{
    "Name": "Humpty",
    "Age": "18",
    "Siblings" : ["Dracula", "Snow White", "Merlin"],
    "Posts": [
        {
            "Title": "How I fell",
            "Comments": [
                { 
                    "User":"Fairy God Mother",
                    "Comment": "Ha, can't say I didn't see it coming"
                }
            ]
        }
    ]
}"

我希望能够搜索JSON字符串并仅提取单个属性。

让我们假设它function已经是一个,看起来就像。

function getPropFromJSON(prop, JSONString){
    // Obviously this regex will only match Keys that have
    // String Values.
    var exp = new RegExp("\""+prop+"\"\:[^\,\}]*");
    return JSONString.match(exp)[0].replace("\""+prop+"\":","");    
}

这将返回的子串ValueKey

例如

getPropFromJSON("Comments")

> "[
    { 
        "User":"Fairy God Mother",
        "Comment": "Ha, can't say I didn't see it coming"
    }
]"

如果您想知道为什么为什么要代替使用它JSON.parse(),我正在建立一个JSON文档存储localStoragelocalStorage仅支持键/值对,因此我JSON将整个字符串存储Document在unique中Key。我希望能够在文档上运行查询,理想情况下无需JSON.parsing()整个Collection过程的开销,Documents然后遍历Keys/
nested Keys来查找匹配项。

我不是最擅长的,regex所以我不知道该怎么做,或者regex独自一人是否有可能。这只是一个实验,以找出是否可能。任何其他想法作为解决方案将不胜感激。


阅读 248

收藏
2020-07-27

共1个答案

一尘不染

我强烈建议您不要这样做。JSON不是此处明确指出的常规语言:https : //cstheory.stackexchange.com/questions/3987/is-
json-a-regular-language

引用以上文章:

例如,考虑一个由数组组成的数组:

[ [ [ 1, 2], [2, 3] ] , [ [ 3, 4], [ 4, 5] ] ]

显然,您无法使用真正的正则表达式进行解析。

我建议将JSON转换为对象(JSON.parse),并实现find函数遍历该结构。

除此之外,您还可以查看Douglas
Crockford的json2.js解析方法的内容。也许经过更改的版本将允许您搜索JSON字符串并仅返回您要查找的特定对象,而无需将整个结构转换为对象。仅当您从不从JSON检索任何其他数据时才有用。如果这样做的话,您可能也已经将整个事情从一开始就进行了转换。

编辑

为了进一步展示正则表达式是如何分解的,下面是一个正则表达式,它试图解析JSON

如果将其插入http://regexpal.com/,并选中“全部匹配”。您会发现它可以很好地匹配某些元素,例如:

正则表达式

"Comments"[ :]+((?=\[)\[[^]]*\]|(?=\{)\{[^\}]*\}|\"[^"]*\")

JSON匹配

"Comments": [
                {
                    "User":"Fairy God Mother",
                    "Comment": "Ha, can't say I didn't see it coming"
                }
            ]

正则表达式

"Name"[ :]+((?=\[)\[[^]]*\]|(?=\{)\{[^\}]*\}|\"[^"]*\")

JSON匹配

"Name": "Humpty"

但是,一旦您开始查询具有嵌套数组的高级结构(例如“帖子”),就会发现您无法正确返回该结构,因为正则表达式没有上下文,其中“]”是指定的结尾结构体。

正则表达式

"Posts"[ :]+((?=\[)\[[^]]*\]|(?=\{)\{[^\}]*\}|\"[^"]*\")

JSON匹配

"Posts": [
  {
      "Title": "How I fell",
      "Comments": [
          {
              "User":"Fairy God Mother",
              "Comment": "Ha, can't say I didn't see it coming"
          }
      ]
2020-07-27