For some reason I fail to write a correct regular expression to match the following strings:
a/b/c/d:d0/d1/d2/d3/:e;f'
a/b/c/d:d0/:e;f'
a/b/c/d:d0/:e'
a/b/c/d:d0'
In each string the c and e should be extracted. As you see, e is optional and the last string doesn't contain it. In that case the regular expression should still match and return the c.
This is the expression that I came up with, but it does not support an optional e:
a\/b\/(?<the_c>\w*)\/.*?\/:(?<the_e>\w*)
I thought to make the last part optional, but then it just doesn't find the e at all:
a\/b\/(?<the_c>\w*)\/.*?(?:\/:(?<the_e>\w*))?
^^^ ^^
Here is a link to test out this example: https://regex101.com/r/C2Jkhq/1
What's wrong with my regex here?
CodePudding user response:
You can use
a\/b\/(?<the_c>\w*)\/(?:.*\/:(?<the_e>\w*))?
Details:
a\/b\/-a/b/string(?<the_c>\w*)- zero or more word chars captured into "the_c" group\/- a/char(?:.*\/:(?<the_e>\w*))?- an optional sequence (that is tried at least once) matching:.*- any zero or more chars other than line break chars as many as possible\/:-/:string(?<the_e>\w*)- zero or more word chars captured into "the_e" group .
See this regex demo.
