Проверка электронной почты: преобразование регулярного выражения, написанного на PHP (preg), в .NET (Regex) - PullRequest
4 голосов
/ 10 января 2010

На основании этого ответа ... Использование регулярного выражения для проверки адреса электронной почты

Что привело меня на этот сайт ... http://fightingforalostcause.net/misc/2006/compare-email-regex.php

Я хотел бы использовать это регулярное выражение для проверки электронной почты для моего приложения ASP.NET MVC:

/^[-_a-z0-9\'+*$^&%=~!?{}]++(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*+@(?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d++)?$/iD

К сожалению, я получаю эту ошибку

System.ArgumentException не было обработано кодом пользователя Сообщение = "разбор \" / ^ [-_ a-z0-9 \ '+ $ ^ &% = ~!? {}] ++ (?: \. [-_ a-z0-9 \' + $ ^ &% = ~ {}] +) * + @ (([-]?!.) [- а-z0-9] + (!?.?

Кто-нибудь когда-нибудь преобразовывал это для использования в классе Regex .NET, или есть другой класс регулярных выражений .NET, который лучше подходит для PHP preg_match функции?

Ответы [ 4 ]

5 голосов
/ 10 января 2010

Проблема с вашим регулярным выражением в .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. Лучше слишком много совпадать, чем слишком мало.

4 голосов
/ 10 января 2010

Вы действительно не должны использовать RegEx для анализа адресов электронной почты в .NET. Ваш лучший вариант - использовать функциональность, встроенную в фреймворк.

Попробуйте использовать строку электронной почты в конструкторе класса MailAddress. Если он выбрасывает FormatException, то адрес не годится.

try 
{
    MailAddress addr = new MailAddress("theEmail@stackoverflow.com")
    // <- Valid email if this line is reached
}
catch (FormatException)
{
    // <- Invalid email if this line is reached
}

Вы можете увидеть ответ , который разработчик Microsoft дал на другой вопрос проверки электронной почты , в котором он объясняет, как в .NET 4.0 также значительно улучшился анализ электронной почты .NET. Поскольку на момент ответа на этот вопрос .NET 4.0 все еще находился в стадии бета-тестирования, вы, вероятно, не запускаете его, однако даже в предыдущих версиях фреймворка имеется соответствующий код для разбора адреса электронной почты. Помните, что в конечном итоге вы, скорее всего, будете использовать класс MailAddress для отправки электронной почты. Почему бы не использовать it для проверки ваших адресов электронной почты. В конце концов, все равно имеет значение быть действительным для класса MailAddress.

1 голос
/ 10 января 2010
Синтаксис регулярного выражения

.NET отличается от синтаксиса в PHP, а Regex - единственный встроенный класс, использующий регулярное выражение (но может быть и другая сторонняя реализация). В любом случае, довольно просто проверить адрес электронной почты с помощью Regex ... прямо из источника

^([0-9a-zA-Z]([-\.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$
0 голосов
/ 10 января 2010

Я использовал эту функцию раньше в куче приложений электронной коммерции, и у меня никогда не было проблем.

    public static bool IsEmailValid(string emailAddress)
    {
        Regex emailRegEx = new Regex(@"\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b");
        if (emailRegEx.IsMatch(emailAddress))
        {
            return true;
        }

        return false;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...