I am trying to parse the three optional components of a string with this format any of these different combinations:
12345,abcd@ABCD   -> $1=12345 $2=abcd $3=ABC
12345,abcd        -> $1=12345 $2=abcd $3=empty
12345@ABCD        -> $1=12345 $2=empty $3=ABC
12345             -> $1=12345 $2=emty $3=empty
Is it possible with a single regexp? I have done several attempts. When the string is complete no problem but the forms with parameters missing are escaping to me:
(.+),(.+)@(.+)           // works when the string is complete
                         //  but how do you express the optionality?
(.+),?(.+)@?(.+)         // nope
(.*)[$,](.*)[$@](.*)     // neither
(Another option, would be splitting the string into the components that looks quite trivial but I am curious about the regexp way)
12345,abcd@ABCD   -> $1=12345 $2=abcd $3=ABC
12345,abcd        -> $1=12345 $2=abcd $3=empty
12345@ABCD        -> $1=12345 $2=empty $3=ABC
12345             -> $1=12345 $2=emty $3=empty
From your expected output it appears that you want empty groups in your matches while matching your inputs. You may use this regex:
/^(\d+),?([^@\n]*)@?(.*)$/g
RegEx Demo
Note that this regex will always return 3 captured groups in every match result.
RegEx Details:
^: Start(\d+): Match 1+ digits and capture in group #1,?: Match an optional comma([^@]*): Match 0+ any character that is not @ and capture in group #2@?: Match an optional @
(.*): Match 0+ any character and capture in group #3$: EndYou can use
^([^,@]+)(?:,([^@]+))?(?:@(.+))?$
See the regex demo (note there are newlines added in the demo pattern since the test is performed against a single multiline string there, in real world, the strings to test won't contain newlines, hence they are not in the pattern here.)
Details
^ - start of string([^,@]+) - Group 1: one or more chars other than a comma and @
(?:,([^@]+))? - an optional non-capturing group matching 1 or 0 occurrences of a comma and then (capturing into Group 2) any one or more chars other than @
(?:@(.+))?  - an optional non-capturing group matching 1 or 0 occurrences of a @ char and then (capturing into Group 3) any one or more chars other than line break chars as many as possible$ - end of string.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With