2017-04-12 66 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