im having some problems with regex and optional groups.
I want to capture the following texts:
"role:subrole.net"
so i created this:
(?<Role>.*)(\:(?<SubRole>.*))(\.(?<net>.*))
and that seems to work just fine.
however when i try to make the "SubRole" and the "net" optional i can not get it to work, ive tried various things like
(?<Role>.*)(\:(?<SubRole>.*)?)(\.(?<net>.*)?)
and at first it still captures all 3 texts, but if i then just test with
"role:subrole", "role.net" or "role" it will not caption anything
ive created a regex101 test case here: https://regex101.com/r/OMyOe1/1
what am i missing? thanks in for your time and insight..
>Solution :
You should place the ?
for the "zero or one occurrence) outside the group with the :
respectively .
at the start, otherwise you have to specify the :
even if you don’t have one of the optional groups to match:
^(?<Role>[^:.]*)(?::(?<SubRole>[^\n.]*))?(?:\.(?<net>.*))?$
(I also incorporated and extendend the hint of @Wiktor Stribiżew to get matches for only role, role.net or role:subrole)