Найти JSON с конкретным содержанием, используя регулярное выражение - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть следующий текстовый файл, который содержит объекты json.

[2018-12-10 06:30:38]..再同步健康数据... 
[2018-12-10 06:30:44]JSON回调处理--->>> 同步运动数据 [2018-12-10 06:30:44]同步运动健康数据json:{  "day" : 10,  "items" : [  {  "activeTime" : 5,  "calory" : 0,  "distance" : 0,  "stepCount" : 0  },
{  "activeTime" : 0,  "calory" : 0,  "distance" : 0,  "stepCount" : 0  },  {  "activeTime" : 0,  "calory" : 0,  "distance" : 0,  "stepCount" : 0  }  ],  "month" : 12,  "startTime" : 0,
"timeSpace" : 15,  "totalActiveTime" : 81,  "totalCalory" : 0,  "totalDistance" : 0,  "StepCount" : 0,  "year" : 2018 }  
[2018-12-10 06:30:44]同步运动健康数据items.sise()=96 
[2018-12-10 06:30:38]..再同步健康数据... 
[2018-12-10 06:30:44]JSON回调处理--->>> 同步运动数据 [2018-12-10 06:30:44]同步运动健康数据json:{  "day" : 10,  "items" : [  {  "activeTime" : 5,  "calory" : 0,  "distance" : 0,  "stepCount" : 0  },
{  "activeTime" : 0,  "calory" : 0,  "distance" : 0,  "stepCount" : 0  },  {  "activeTime" : 0,  "calory" : 0,  "distance" : 0,  "stepCount" : 0  }  ],  "month" : 12,  "startTime" : 0,  "timeSpace" : 15,  "totalActiveTime" : 81,  "totalCalory" : 0,  "totalDistance" : 0,  "totalCount" : 0,  "year" : 2018 }  
[2018-12-10 06:30:44]同步运动健康数据items.sise()=96

До сих пор я определил следующее выражение, которое извлекает объекты json.

json:.+?(?=\[2)

Я хочу извлечьтолько один объект json, который содержит элемент с именем `totalCount.Что мне добавить к моему действительному выражению?

Опубликованный текстовый файл с замененными местами объектов json

[2018-12-10 06:30:44]JSON回调处理--->>> 同步运动数据 [2018-12-10 06:30:44]同步运动健康数据json:{  "day" : 10,  "items" : [  {  "activeTime" : 5,  "calory" : 0,  "distance" : 0,  "stepCount" : 0  },
{  "activeTime" : 0,  "calory" : 0,  "distance" : 0,  "stepCount" : 0  },  {  "activeTime" : 0,  "calory" : 0,  "distance" : 0,  "stepCount" : 0  }  ],  "month" : 12,  "startTime" : 0,  "timeSpace" : 15,  "totalActiveTime" : 81,  "totalCalory" : 0,  "totalDistance" : 0,  "totalCount" : 0,  "year" : 2018 }  
[2018-12-10 06:30:44]同步运动健康数据items.sise()=96
[2018-12-10 06:30:38]..再同步健康数据... 
[2018-12-10 06:30:44]JSON回调处理--->>> 同步运动数据 [2018-12-10 06:30:44]同步运动健康数据json:{  "day" : 10,  "items" : [  {  "activeTime" : 5,  "calory" : 0,  "distance" : 0,  "stepCount" : 0  },
{  "activeTime" : 0,  "calory" : 0,  "distance" : 0,  "stepCount" : 0  },  {  "activeTime" : 0,  "calory" : 0,  "distance" : 0,  "stepCount" : 0  }  ],  "month" : 12,  "startTime" : 0,
"timeSpace" : 15,  "totalActiveTime" : 81,  "totalCalory" : 0,  "totalDistance" : 0,  "StepCount" : 0,  "year" : 2018 }  
[2018-12-10 06:30:44]同步运动健康数据items.sise()=96 
[2018-12-10 06:30:38]..再同步健康数据... 

1 Ответ

0 голосов
/ 20 декабря 2018

Вы можете изменить свое регулярное выражение с

json:.+?(?=\[2)

на

(?s)json:(?!.*json:.*totalCount.*).*?totalCount.*?(?=\[2)

, чтобы ваш json соответствовал только тому, который содержит totalCount внутри него.

Этот отрицательный прогноз (?!.*json:) гарантирует, что предыдущее совпадение json: будет отменено в тот момент, когда он увидит еще один json: в строке, в результате чего он начнет выполнять сопоставление с ближайшим json: вместо первого.

Демо

...