2017-04-12 69 views
0

我有以下的JSON数组:正则表达式为负先行JSON

[ 
    { 
     "roleId": 128, 
     "roleName": "B", 
     "Permissions": [] 
    }, 
    { 
     "roleId": 310, 
     "roleName": "ROLE", 
     "Permissions": [ 
     { 
      "permissionId": 8074, 
      "isPermissionActive": true 
     }, 
     { 
      "permissionId": 2271, 
      "isPermissionActive": true 
     }, 
     { 
      "permissionId": 8075, 
      "isPermissionActive": true 
     }, 
     { 
      "permissionId": 2275, 
      "isPermissionActive": true 
     } 
     ] 
    }, 
    { 
     "roleId": 201, 
     "roleName": "B", 
     "Permissions": [] 
    }, 
    { 
     "roleId": 5, 
     "roleName": "B", 
     "Permissions": [] 
    } 
    ] 

,我需要选择非空权限jsons的roleId。我试过使用负向预测,但似乎没有工作。
在选择roleId之前,我想在json上获得正确的匹配,所以我尝试了\{(\s*.*?(?!"Permissions":\s*\[\]))*\},但它似乎匹配所有的jsons甚至权限数组的内部jsons。应该如何改变前瞻以适当地匹配。我目前在崇高的文本匹配3.

回答

2

试试下面的正则表达式:

(?<="roleId":)\d*(?=(?:[^{]*"Permissions": \[(?!]))) 

说明: 第一部分(?<="roleId":)\d*使用正回顾后找到rollId 第二部分(?=(?:[^{]*"Permissions": \[(?!])))负向前查找发现非-null权限和积极lookahead查找具有非空权限的rollId。 See detailed explanation here

1

尽管这并不直接回答您的问题,但我想指出,使用JavaScript处理JSON或使用能够轻松将JSON转换为本机类型的许多语言之一来处理JSON可能更自然。可替换地,可以使用一个JSON处理语言如jq

jq ' 
    map(select(.Permissions != []) | .roleId) 
' 

产生角色ID的具有非空的权限的阵列。

+0

好选择!将为未来记住这一点! – TheChetan

1

用于检查数字是否为“roleId”的后视。
还有一个前瞻来检查“权限”是否有胡子。

(?<="roleId":)\d+(?=[^\}]*?"Permissions":\s*\[\s*\{) 

测试它here