Home > OS >  A regex to parse regex string
A regex to parse regex string

Time:12-26

I need to parse a regex with regex. I have a regex string:

[a-z]{1}[-][0-9]{4}[-][ab]

The actual regex for parsing the string above that I came up with and which almost works is:

/(?|\[(.*?)\]\{(.*?)\}|\[(.*?)\](.*?))/g

What does it do can be seen in this regex101 example and the error here is in the Match 2 and its Group 1 (-][0-9, which should be just -).


The goal is to match everything inside of square brackets [] followed by a number inside curly brackets {}. If curly brackets {} after square brackets [] are missing it should fill it with null and this is what alternative group is doing with branch reset group. Also if just square brackets followed by a square brackets, then it's expected to act as later as well (match what's on the inside of square brackets [] and fill Group 2 with null).

The problem that my regex doesn't stop on third [-] and matches it upto -][0-9 instead of matching just - and then starting with parsing [0-9]{4}.

The expected match should be:

[a-z]{1}
a-z
1

[-]
-
null

[0-9]{4}
0-9
4

[-]
-
null

[ab]
ab
null

The current match is incorrect and is as follows:

[a-z]{1}
a-z
1

[-][0-9]{4}
-][0-9
4

[-]
-
null

[ab]
ab
null

What am I missing?

CodePudding user response:

This regex should work:

\[([^]]*)](\{\d \}|)

Demo

Explanation:

  • \[ - matches [
  • ([^]]*) - matches 0 occurrences of any character that is not a ] and captures this submatch in group 1
  • ] - matches ]
  • (\{\d \}|) - either matches nothing OR a { followed by 1 digits followed by }. Whatever is matched is stored in Group 2

CodePudding user response:

If you write these in JS, you should delete the first item in regex ( /(\[(.*?)\]\{(.*?)\}|\[(.*?)\](.*?))/g )

And if you want to check the difference between JS and PHP ( Php is the default in regex101) this link can be helpful.

  • Related