Having a read and play with Regex this morning, this method works OK too, but I’m sure it can be further streamlined;
REGEX_REPLACE(
REGEX_REPLACE(
REGEX_EXTRACT({JSON Data},
'Colour","VAL":".*"ID'),
'Colour","VAL":"',""),
'","ID',""
)
REGEX_REPLACE(
REGEX_REPLACE(
REGEX_EXTRACT({JSON Data},
'Shape","VAL":".*"ID'),
'Shape","VAL":"',""),
'","ID',""
)
Both “Red”, “Square” and “Purple” , “Triangle” are returned respectively.
I believe my problem is from having the entire string arguments returned along with the desired center text, when realistically I just want the center text from the return of my argument. For example;
REGEX_EXTRACT(Data,'VAL":".*"ID')
I 'm only needing the .* text to return, not the wrappers.
Woo hoo, I finally found my solution! I needed to employ Regex Grouping using (), and Airtable returns the first group.
REGEX_EXTRACT(Data,'Size","VAL":"(.*)",')
So again, using this input;
{"NAME":"Colour","VAL":"Red","ID":"1"},
{"NAME":"Shape","VAL":"Square","ID":"2"},
{"NAME":"Size","VAL":"500","ID":"3"},
{"NAME":"Scale","VAL":"2","ID":"4"}
We can now easily extract values of variables into their own field using the same formula, but simply swapping out the variable name, Colour, Shape, Size etc.

Remember to wrap Integers or Decimals with ABS() too if not wanting a text string for numbers.
This is tidy as, I love it! Thanks @kuovonne and @ScottWorld - hopefully this might help you both too.
EDIT: Lol, the plot thickens. My test data had new lines, but unfortunately my real world data is one very long string, and now I have to figure out why Regex selects the very last ", in the string, rather than the next ", :sob:

Ahh ha! Added a ? to the wild card, which makes the search “non-greedy”.
REGEX_EXTRACT(Data,'Size","VAL":"(.*?)",')