可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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?
回答1:
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.
回答2:
Old post - needed the same RegEx. The accepted answer did not work for me, however, this did.
^(|([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+([;.](([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+)*$
Retrieved from this post, however, the accepted answer did not work either, but the Regex on the link WITHIN the post did.
abc@abc.com
- validates
abc@abc.com;123@qwer.com
- validates
abc@abc.com;
- does not validate
empty string
- validates
If you want to validate against an empty string, then remove the |
at the beginning of the regex
回答3:
Why not just split on the semicolon and then validate each potential email address using your existing regexp ? Writing one huge regexp is going to be very difficult and a maintenance nightmare, I suspect.
回答4:
Please try this
^([\w+-.%]+@[\w-.]+\.[A-Za-z]{2,4};?)+$
回答5:
Domain names are actually way more complex. For example, most TLDs are now using Unicode domain names, which are quite common in Europe. Consider the email address mailtest@пример.испытание, which is actually perfectly valid
(though they can always be transcribed to the old form - mailtest@xn--hxajbheg2az3al.xn--jxalpdlp). This means that it is probably easier to define what characters are not valid for a domain name. See ICANNs.
In addition, the TLDs are also not strictly part of the set you have defined, see IANAs list of valid TLDs. For example, example@example.travel is a valid email address.
In short, to validate email addresses, consider going with an established third party library, unless you are dealing with a limited special case.
Now for your original question, I would recommend a preprocess stage where you split on reasonable delimiters (',' and ';'), trim whitespace (at least if dealing with user input) and validate each entry.
回答6:
In an old regex book they stated that you cannot write a regex to match all valid email addresses (although you can come close).
Here is a website dealing with regex and email addresses.
I would recommend that you split the string at ;
and ,
boundaries and check each email address separately for being valid/invalid with your regex.
回答7:
Below is my solution and it worked as expected for me:
var emailReg = new RegExp(/^([A-Z0-9.%+-]+@@[A-Z0-9.-]+.[A-Z]{2,6})*([,;][\s]*([A-Z0-9.%+-]+@@[A-Z0-9.-]+.[A-Z]{2,6}))*$/i);
var emailText = $('#email').val();
if (!emailReg.test(emailText)) {
alert('Wrong Email Address\Addresses format! Please reEnter correct format');
return false;
}
}
回答8:
Something I've written in my days.
Basic email validation is taken from practical implementation of RFC 2822
^([a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])(;)?)+$
matches emails with ; separator
I you want more separators swap (;)? with [;,|]? etc withing the [] brackets.
回答9:
Here is a simple Program which does this for you without using the Regular Expression.Well Actually it does use a regular expression but we don't have to worry about it how it looks .php does this for us .
public function test_reg()
{
$email_list = '';
$array = explode(";",$email_list);
foreach ($array as $value)
{
$value;
if (!filter_var($value, FILTER_VALIDATE_EMAIL) === false)
{
$msg = "Email List Contains valid email addresses.";
}
else
{
$msg ="Your Email list contains an invalid email at.     ".$value;
break;
}
}
echo $msg;
}
You have to separate your emails by a semi colon.
回答10:
This is a very old question, but I figured I'd share my C# code.
I decided to parse by the semicolon then check each email individually:
string toAddress = "testemail@gmail.com;test2@testing.com;";
Regex rgx = new Regex(@"^[_a-z0-9-]+(\.[_a-z0-9-]+)*(\+[a-z0-9-]+)?@[a-z0-9-]+(\.[a-z0-9-]+)*$");
List<string> emailArray = new List<string>();
if(toAddress != null && toAddress != "")
{
if (toAddress.IndexOf(";") != -1)
{
emailArray = toAddress.Replace(" ","").Split(';').ToList();
}
else
{
emailArray.Add(toAddress);
}
foreach (string email in emailArray)
{
if (rgx.IsMatch(email ?? ""))
{
SendEmail(email, subject, body);
}
}
}