I get a response from the backend as text in which I have to find a match for numbers which is minimum 16 digits in length.
Let’s say I have data something like this:
{"BIG_INT": 123456789012345675,"BIG_INT_ARRAY_SINGLE": [123456789012345676],"BIG_INT_ARRAY_MULTIPLE": [123456789012345661,12345678901234562,12345678901234563,12345678901234564],"STRING_BIG_INT_ARRAY": "[12345678901234567,12345678901234567, 12345678901234567,12345678901234567]","STRING_BIG_INT":"12345678901234567","BIG_INT_FLOATING_DECIMAL": 12345678901234567.76543210987654321}
There are certain conditions where it should not match a number:
- If the number is enclosed within double quotes:
("STRING_BIG_INT":"12345678901234567"
)` - If the numbers are within string enclosed array:
"STRING_BIG_INT_ARRAY":"[12345678901234567,12345678901234567]"
- If the number is fractional:
"BIG_INT_FLOATING_DECIMAL":12345678901234567.76543210987654321
Conditions where it should match a number:
- If it’s an integer
"BIG_INT": 123456789012345675
, here value123456789012345675
should get matched. - If it’s inside an array
"BIG_INT_ARRAY_MULTIPLE":[123456789012345678,123456789012345678]
here these two numbers should be matched separately.
I tried this regular expression -> (:s*)([[])?(d{16,})(s*)([,}]])
One con in this expression is if we have a array of numbers
"test":[12345678901234567,1236543858688483444,26531562351351374343]
, here my expression only matches the first number. I wanted to match all the numbers inside the array if the array is not enclosed by double quotes.
After matching all numbers, I have code like this to replace numbers to a BigInteger formate(Ex:"16536235653725645345n") and I extract the value part of it and convert the number to a BigInteger.
const bigNumsRegExp = new RegExp(/(:s*)([[])?(d{16,})(s*)([,}]])/g);
`const serializedData = data.replace(bigNumsRegExp, '$1$2"$3n"$4$5');`
So I only wanted a regular Expression which match numbers only from BIG_INT
,BIG_INT_ARRAY_SINGLE
and BIG_INT_ARRAY_MULTIPLE
Any help from anyone is appreciated.
Thanks
2
Answers
Here’s a JSON reviver that parses https://tsplay.dev/wXyloN
It parses JSON while replacing the numbers that would lose precision while parsing with their BigInt variant taken from the original string
Here’s what it produces for your input:
Nothing complicated since JSON has a very limited number of types:
Example that put double-quotes around integers (when needed):