0

I am trying to replace the values for a specific variable named variable but only if this is contained between two strings, namely between group1 and group2. (or group1 till the end of text if group2 isn't found)

variable can also be found between group2 and group1 but should not be touched!

A picture is better than a thousand words so here's what I am trying to achieve: variable found in the blue highlighted zone need to be individually matched. other variable need to be ignored, and left as it is. enter image description here

I got two regex but cannot find how to make them work together in one regex...

  • group1(.*?)group2 shows me the text between group1 and group2
  • \"variable\":\d{1,2} shows me the variable and their value that I need to match

My JSON text is

{"mastercont":{"subcont":368,"whatever":236,"anothergroup":{"ItemsG1":["cf8013791a1948e9ad7ec913353cf108","7093f33afa794316af1a6e43d3e3e42f","38670584b898415e9e2e3b2dee39610c","d4d17e6a40ee4b4187a421ac230b6bb0","053c112d38384fa6bff09c01fa48f10d"],"items":[{"id":"14cec419535e449e9d367cb89dfe9b45","Template":"4fdf0640c1094f6cad1d37c332d01180","var3":10,"var2":3035385,"prop":{"group1":[{"id":"e4d9f3206a0d4dd3947a9ab887e2a866","variable":8},{"id":"33f866a5f2f546afac13fa5f02bedfbf","variable":8}]}},{"id":"a5c48bf889cd4a609ef32582c034a137","Template":"023bbfbbd15646ce8eb92cad079142fd","var3":10,"var2":2627635,"prop":{"group1":[{"id":"b4de8d1bd8a145758517c1e5800a7525","variable":5}]}},{"id":"4266dd790972412b8202506f82f07bce","Template":"d501df0303664ee798085626d1b5f58a","var3":10,"var2":2687981,"prop":{"group1":[{"id":"c40ed85187774d09b1690223dae8f67d","variable":7},{"id":"1674a05b355a4c0199947a28e2654d4c","variable":7},{"id":"bf107d7d87774411b07a56819a58a709","variable":7}]}},{"id":"8d9215eb57bd4a9c97c97042602f7385","Template":"0e24274c1f9f4a75b72459237776a6f5","var3":10,"var2":2776081,"prop":{"group1":[{"id":"464bedb7a63143b6a2dff65f089d39da","variable":7}]}},{"id":"d461eb38afc445b4be85c8fd9ca4b61e","Template":"12ab90763c034e628f89f36fbe08bd0c","var3":10,"var2":3991635,"prop":{"group1":[{"id":"848e02b432ae4e1b809c83bca039542a","variable":10}]}}]},"loadout":{"equippedItems":{"48021ab1a1a6487b80a4ca472a4d0c77":{"id":"cf8013791a1948e9ad7ec913353cf108","Template":"4535a4bf490a46d5b49ca9bc0cc81fe6","var3":10,"var2":287004,"prop":{"group1":[{"id":"e4d9f3206a0d4dd3947a9ab887e2a866","variable":10},{"id":"c02cf3392c634456bdd1f4ad1e25bf3f","variable":10},{"id":"e8e0bb2627514cacbd20effdec8dea4d","variable":10}]},"slot":"48021ab1a1a6487b80a4ca472a4d0c77"},"36d141e47783466c95656f90f09de428":{"id":"f68adc253dff47f586ba5229b8ddfe81","Template":"1ca7737c1eef462ab85d922dfb5eb5b6","grade":3,"prop":{"group1":[{"id":"80980773a3884f719ba5ac69a7e307be","variable":9},{"id":"2e56b62015ce4db29eef2faf139f6185","variable":9},{"id":"0717438e41e04414913ca089a60666c0","variable":9}],"group2":[{"id":"ff35b37f7bc3455f81d73a2b60417ab5","variable":1},{"id":"2fc557411c8946cd85e2a8a27f6cea38","variable":1},{"id":"7ed4d49b50534a5dbbacb32a96871a85","variable":1}]},"slot":"36d141e47783466c95656f90f09de428"},"417e79dec81042f88273f9759df6ae25":{"id":"d4d17e6a40ee4b4187a421ac230b6bb0","Template":"9094f0d120c84013ab3877177a009a78","var3":10,"var2":4109,"prop":{"group1":[{"id":"c40ed85187774d09b1690223dae8f67d","variable":7}]},"slot":"417e79dec81042f88273f9759df6ae25"},"897a600c91d64449af09173da88a907e":{"id":"053c112d38384fa6bff09c01fa48f10d","Template":"c74b89cb19cc45299c7eec6b53bcac17","var3":10,"var2":326029,"prop":{"group1":[{"id":"e4d9f3206a0d4dd3947a9ab887e2a866","variable":10}]},"slot":"897a600c91d64449af09173da88a907e"},"862605dec67f4bceb5274e5fb6f25162":{"id":"21e4c1490f0c4c7bbe3b012a51823712","Template":"875aa16e9d2646a0934e6ba5b2a5299f","var3":10,"var2":5044607,"prop":{"group1":[{"id":"b64fa9d44f134bb4912916df08e84757","variable":10},{"id":"a869f868c23f45bb9159d62b42236a4a","variable":10}]},"slot":"862605dec67f4bceb5274e5fb6f25162"},"e273a4d7fb874f7e8f1e398be59afbcb":{"id":"7093f33afa794316af1a6e43d3e3e42f","Template":"b73fa9abfdd049a08b16de3b8a8961fd","var3":10,"var2":287004,"prop":{"group1":[{"id":"e4d9f3206a0d4dd3947a9ab887e2a866","variable":10},{"id":"c02cf3392c634456bdd1f4ad1e25bf3f","variable":10}]},"slot":"e273a4d7fb874f7e8f1e398be59afbcb"},"58b6d1212e234fa4b892c92ae2e2c4c5":{"id":"38670584b898415e9e2e3b2dee39610c","Template":"67b78223916e440b8ec6fc14b83e1150","var3":10,"var2":417904,"prop":{"group1":[{"id":"626121b7708d455fb32f38e5b68bb80c","variable":9}]},"slot":"58b6d1212e234fa4b892c92ae2e2c4c5"},"959c1931bf85458792ec8ecaa58b06d5":{"id":"8019f35c15744377ab99eb0b2ad87ec0","Template":"d408a9123a4f4b2abf4da55b78910f08","grade":5,"prop":{"group1":[{"id":"626121b7708d455fb32f38e5b68bb80c","variable":3},{"id":"8fd72d413e824865b49eb576b8384aa9","variable":3}],"group2":[{"id":"f17be1d91c1e451085143d108b92220f","variable":2},{"id":"0eec28838bc14fdda9398292b545e35d","variable":2},{"id":"d17491225ada4017918d990fc7717481","variable":1}]},"slot":"959c1931bf85458792ec8ecaa58b06d5"},"0d8f2023470141e88bd592381d787456":{"id":"c4fe7d61a70642afb4bd62b28add56cb","Template":"d408a9123a4f4b2abf4da55b78910f08","grade":3,"prop":{"group1":[{"id":"626121b7708d455fb32f38e5b68bb80c","variable":7},{"id":"262ece9bbd654876b6985926ca4422be","variable":7}],"group2":[{"id":"8e9928a847934e15ae2491c41aebad9c","variable":1},{"id":"6d4e443734484a6198e812a7e6850c8c","variable":1},{"id":"6bc195682f764c0e8482dee16629dc5b","variable":1}]},"slot":"0d8f2023470141e88bd592381d787456"}}}}}

Based on the comment below from toto, a working regex is (?:"group1"|\G(?!^))(?:(?!"group2"|"variable").)*("variable":\d*) https://regex101.com/r/5EGTHu/1 But I fail to understand how I can replace variable:xx by variable:10

Any help with the substitution / replace would be greatly appreciated. I tried various input but I only end up adding text to $0 or loosing the whole match.

Note that I unfortunately have to use a regex here, and cannot use a json parser.

Florian Bidabé
  • 640
  • 8
  • 22
  • 1
    Don't use regex to try to parse JSON...use a proper JSON parser or library. – Tim Biegeleisen Aug 12 '20 at 04:40
  • Thank you Tim, I suppose you did not read my last sentence ;-) – Florian Bidabé Aug 12 '20 at 04:46
  • Can you explain why you can't use a JSON parser? Are you using a programming language? If so, which, if not, what environment are you using? Another way to make it easier to answer this question is to minimize the JSON to a simpler version that still has the properties you're interested in--it's not easy to reason about such a large string. – ggorlen Aug 12 '20 at 05:06
  • Hi ggorlen, sure thing. I am using web tools (MITM proxies) to perform some testing and behavioural analysis. The tools I use are Burp Suite and Charles. I am unaware of how to interface these proprietary tools with a programming language (I'm quite proficient in bash, sql or php) and their API calls seem quite restricted (if any) – Florian Bidabé Aug 12 '20 at 05:43
  • 1
    Is [this](https://regex101.com/r/5EGTHu/1) what you want? – Toto Aug 12 '20 at 08:32
  • Yes sir! Now it is not part of my question, but how do I substitute the digits only by "10" for group 1 matches... and not for the whole group 0 – Florian Bidabé Aug 13 '20 at 06:35
  • I've made an anwser that does the substitution. – Toto Aug 13 '20 at 12:12

1 Answers1

1

I make my comment an answer.

Use

  • Find: (?:"group1"|\G(?!^))(?:(?!"group2"|"variable").)*"variable":\K\d*
  • Replace: 10

Demo & explanation

If \K is not supported, use:

  • Find: ((?:"group1"|\G(?!^))(?:(?!"group2"|"variable").)*"variable":)\d*
  • Replace: ${1}10

Demo & explanation

Toto
  • 89,455
  • 62
  • 89
  • 125
  • Thank you! This definitely successfully solves the challenge... unfortunately \K is not supported in my app... hum, that was close... – Florian Bidabé Aug 13 '20 at 13:20
  • @FlorianBidabe: Just add a capture group for all that is matched before the `\K` and replace with `${1}10`. `((?:"group1"|\G(?!^))(?:(?!"group2"|"variable").)*"variable":)\d*`. See my edit – Toto Aug 13 '20 at 14:47
  • Parfait! Et bien merci bien Toto! – Florian Bidabé Aug 13 '20 at 22:55