Reputation: 12202
I'm sorry for asking this maybe duplicate question. I checked the existing questions and answers about optional capturing groups. I tried some things but I'm not able to translate the answer to my own example.
This are two imput lines
id:target][label
id:target
I would like to capture id:
(group 1), target
(group 2) and if ][
is present label
(group 3).
The used regex (Python regex) only works on the first line (live example on regex101).
^(.+:)(.*)\]\[(.*)
In the other examples I don't get what the regex makes a capturing group optional. And maybe the delimiter ][
used by me also mix up with my understanding problem.
One thing I tried was this
^(.+:)(.*)(\]\[(.*))?
Upvotes: 0
Views: 65
Reputation: 163447
You could write the pattern using an anchor at the end, a negated character class for group 1, a non greedy quantifier for group 2 and then optionally match a 3rd part:
^([^:]+:)(.*?)(?:]\[(.*))?$
Explanation
^
Start of string([^:]+:)
Group 1, match 1+ chars other than :
and then match :
using a negated character class(.*?)
Group 2, match any char, as few as possible(?:
Non capture group to match as a whole part
]\[
Match ][
(.*)
Group 3, match any character)?
Close the non capture group and make it optional$
End of stringSee a regex101 demo
If you are only matching for example word characters, this you might consider:
^([^:]+:)(\w+)(?:]\[(\w+))?
See a another regex101 demo
Upvotes: 1