Проблема с вашим регулярным выражением в .NET заключается в том, что притяжательные квантификаторы не поддерживаются. Если вы удалите их, это работает. Вот регулярное выражение в виде строки C #:
@"^[-_a-z0-9\'+*$^&%=~!?{}]+(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*@(?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d+)?$"
Вот тестовая таблица для него на основе страницы, на которую вы ссылались , включая все строки, которые должны соответствовать, и первые три из тех, которые не должны:
using System;
using System.Text.RegularExpressions;
public class Program
{
static void Main(string[] args)
{
foreach (string email in new string[]{
"l3tt3rsAndNumb3rs@domain.com",
"has-dash@domain.com",
"hasApostrophe.o'leary@domain.org",
"uncommonTLD@domain.museum",
"uncommonTLD@domain.travel",
"uncommonTLD@domain.mobi",
"countryCodeTLD@domain.uk",
"countryCodeTLD@domain.rw",
"lettersInDomain@911.com",
"underscore_inLocal@domain.net",
"IPInsteadOfDomain@127.0.0.1",
"IPAndPort@127.0.0.1:25",
"subdomain@sub.domain.com",
"local@dash-inDomain.com",
"dot.inLocal@foo.com",
"a@singleLetterLocal.org",
"singleLetterDomain@x.org",
"&*=?^+{}'~@validCharsInLocal.net",
"missingDomain@.com",
"@missingLocal.org",
"missingatSign.net"
})
{
string s = @"^[-_a-z0-9\'+*$^&%=~!?{}]+(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*@(?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d+)?$";
bool isMatch = Regex.IsMatch(email, s, RegexOptions.IgnoreCase);
Console.WriteLine(isMatch);
}
}
}
Выход:
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
False
False
False
Проблема, однако, заключается в том, что он не соответствует некоторым действительным адресам электронной почты, таким как foo\@bar@example.com
. Лучше слишком много совпадать, чем слишком мало.