Home > Software design >  Regex to get every character that appears between equals sign and text
Regex to get every character that appears between equals sign and text

Time:11-21

I would like to get all the text/numbers that appear after the equals sign such that this input

"Input: m = 2, n = 3, indices = [[0,1],[1,1]]"

Would return this output:

[2,3, [[0,1],[1,1]] ]

This is what I have tried:

eachEx.match(/= (. )/)[1]

However this returns:

2, n = 3, indices = [[0,1],[1,1]]

I have thought of splitting the string and iterating through each element, passing it through the match I have. However, the problem is that I would lose the ability to know whether or not the element in question was meant to be a string or an integer or an array. I need to know this information

CodePudding user response:

I won't be surprised if you end up needing to write a simple parser for this, rather than a single regex. But the specific example given can be done with a single regex. It's just that I suspect when you throw more examples at it, it'll become too complicated.

If the thing that makes the , a delimiter after the 2 and 3 but not in the final match is that the final match is wrapped in [___], then you can use an alternation to adjust what characters are allowed in the capture:

/= (\[[^=] \]|[^=,] )/

That says that if the text starts with [ and ends with ], match all non-= inside it. Otherwise, match all non-= and non-,.

Then, to get all the matches, add a g flag and use matchAll, then post-process the iterable you get from it to extract the capture groups:

const eachEx = "Input: m = 2, n = 3, indices = [[0,1],[1,1]]";

const match = eachEx.matchAll(/= (\[[^=] \]|[^=,] )/g);
console.log(Array.from(match, ([, capture]) => capture));

As an example of a string that would be parsed incorrectly by that, consider "a = [3, [2, ], b = 3", which gives us the array [ "[3, [2, ]", "3" ] when probably it should be an error:

const eachEx = "Input: a = [3, [2, ], b = 3";

const match = eachEx.matchAll(/= (\[[^=] \]|[^=,] )/g);
console.log(Array.from(match, ([, capture]) => capture));

Hence the warning above that you may need to write a simple parser instead.

  • Related