Обнаружение электронной почты в тексте с помощью регулярных выражений - PullRequest
0 голосов
/ 19 января 2012

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

Мое регулярное выражение:

([\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?)

Но оно обнаруживает3 совпадения в следующем примере текста:

ttt <a href='mailto:someone@example.com'>someemail@mail.com</a> abc email@email.com

Я хочу, чтобы регулярное выражение совпадало только с email@email.com.

Ответы [ 2 ]

2 голосов
/ 22 января 2012

Лучше оставить синтаксический анализ HTML-кода подходящим для этого (например, HtmlAgilityPack ) и объединить его с регулярным выражением для обновления текстовых узлов:

    string sContent = "ttt <a href='mailto:someone@example.com'>someemail@mail.com</a> abc email@email.com";
    string sRegex = @"([\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?)";
    Regex Regx = new Regex(sRegex, RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);

    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(sContent);

    var nodes = doc.DocumentNode.SelectNodes("//text()[not(ancestor::a)]");
    foreach (var node in nodes)
    {
        node.InnerHtml = Regx.Replace(node.InnerHtml, @"<a href=""mailto:$0"">$0</a>");
    }
    string fixedContent = doc.DocumentNode.OuterHtml;

Я заметил, что вы опубликовали тот же вопрос и на других форумах , но не назначили ответ ни на одном из них.

2 голосов
/ 19 января 2012

Очень похоже на мой предыдущий ответ на другой ваш вопрос, попробуйте этот

(?<!(?:href=['"]mailto:|<a[^>]*>))(\b[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?)

Единственное, что действительно отличается - это граница слова \b перед началом письма.

См. Аналогичное выражение здесь, в Regexr , это не совсем то же самое, потому что Regexr не поддерживает чередования и бесконечную длину в просмотре позади.

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