SeToY SeToY - 8 days ago 7
C# Question

Regex for validating multiple E-Mail-Addresses

I got a Regex that validates my mail-addresses like this:

([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)


This works perfectly fine, but only allows one e-mail to be entered. Now I wanted to extend that and allow multiple mail-addresses to be added (just like MS Outlook, for example) with a semicolon as a mail-splitter.

mail1@tld.com;mail2@tld.com;mail3@tld.com


Now I've searched and found this one:

([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}(;|$))


This works on one point, but sadly requires a semicolon at the end of a mail:

mail1@tld.com;


This is not what I want when the user only enters one e-mail.

How can I extend my regex above (the first one) to allow multiple mail-addresses to be added while let them be splitted through a semicolon?

Answer

This is your original expression, changed so that it allows several emails separated by semicolon and (optionally) spaces besides the semicolon. It also allows a single email address that doesn't end in semicolon.

This allows blank entries (no email addresses). You can change the final * by + to require at least one address.

(([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)(\s*;\s*|\s*$))*

If you need to allow comma, apart from semicolon, you can chage this group:

(\s*;\s*|\s*$)

by this one:

(\s*(;|,)\s*|\s*$)

Important note: as states in the comment by Martin, if there are additional text before or after the correct email address list, the validation will not fail. So it would work as an "email searcher". To make it work as a validator you need to add ^ at the beginning of the regex, and $ at the end. This will ensure that the expression matches all the text. So the full reex would be:

^(([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)(\s*;\s*|\s*$))*$

You can add an extra \s* after the ^ to tolerate blanks at the beginning of the list, like this. I.e. include ^\s* instead of simply ^ The expression already tolerates blanks at the end as is.

Comments