2017-04-12 16 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": [] 
    } 
    ] 

を私がnull以外の権限でjsonsのroleIdを選択する必要があります。私は否定的な先読みを使ってみましたが、うまくいきません。
roleIdを選択する前に、私は\{(\s*.*?(?!"Permissions":\s*\[\]))*\}を試したので、jsonに正確なマッチを得たいと思っていましたが、それはすべてのjsonsと許可配列の内側のjsonsと一致するようです。どのように見た目を適切に一致させるために変更する必要があります。

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

説明:最初の部分(?<="roleId":)\d*がrollId 第二部に(?=(?:[^{]*"Permissions": \[(?!])))否定先読みを見つけるために、正の後読みを使用しています 非見つける私は現在、次の正規表現を試してみてください。3.

答えて

2

崇高なテキストで一致していますnull以外のアクセス権を持つrollIdを見つけるには、-nullの許可と肯定的な先読みが必要です。 See detailed explanation here

1

これはあなたの質問に直接答えるものではありませんが、JavaScriptを使用してJSONを処理したり、JSONをネイティブタイプに簡単に変換できる多くの言語のいずれかで処理する方が自然かもしれません。

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

非空の権限を持つロールIDの配列を生成します。また、あなたは、このようなjqとしてJSON処理言語を使用することができます。

+0

良いオプション!未来のことを念頭に置いてください! – TheChetan

1

数字が "roleId"であるかどうかを調べるための見識。
「許可」に口ひげがあるかどうかを確認するための先読み。

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

テストそれhere

関連する問題