2013-09-26 5 views
0

Прямо сейчас у меня есть регулярное выражение \w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*, чтобы соответствовать адресу электронной почты, для этой ситуации это хорошо.Regex для сопоставления нескольких писем

Я пробовал разные вещи для сопоставления ячеек csv, но я не могу заставить их работать для этого.

Что мне нужно что-то, что соответствует регулярному выражению выше, но есть разделитель между ними, есть три различных разделителей '|' ',' ';', например, я хочу, чтобы соответствовать

[email protected] 

[email protected]|[email protected]|[email protected] 

[email protected],[email protected],[email protected] 

[email protected];[email protected];[email protected] 

я не забочусь о пробельных, поэтому необходимо учитывать их добавления дополнительных пробелов в, в то время как все еще приходится выше, например:

[email protected] | [email protected]|[email protected] 

это также необходимо, чтобы иметь возможность использовать комбинацию разделителей

[email protected],[email protected];[email protected]|[email protected] 

Я делаю это в c#

Примечание, я смотрел на эту How to match a comma separated list of emails with regex?

Но я не знаю, как изменить ^([\w+-.%][email protected][\w-.]+\.[A-Za-z]{2,4},?)+$, чтобы удовлетворить мои потребности

В настоящее время у меня есть

(\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*[\s?[,|\||;|]\s?]?)+$ 
+0

@hwnd, я видел адреса электронной почты в форме 'john.malcovic + some-subadres @ sub.domain.museum.uk';) Многие интернет-формы этого не принимают. Да, .museum является допустимым расширением домена. Я не знаю о '' 'хотя, может быть ... – funkwurm

+0

Да' ''мне любопытно – hwnd

+0

Фактические адреса электронной почты могут быть чрезвычайно сложными. Больше, чем большинство людей понимают. Например, знаете ли вы, что адреса электронной почты могут содержать комментарии? http://en.wikipedia.org/wiki/Email_address предполагает, что 'john.smith (comment) @ example.com' является допустимым адресом электронной почты, например.В общем, я не думаю, что проверка адресов электронной почты с помощью Regex - хорошая идея, главным образом потому, что всегда есть действительный адрес электронной почты, который не распознается. Конечно, вам, возможно, не всегда требуется надежная защита ... – Chris

ответ

1

Я бы использовал комбинацию String.Split() и конструктор MailAddress. Что-то вроде этого:

public bool ValidAddressText(string input) 
{ 
    string[] addresses = input.Split(new Char[] { ',', ';', '|' }); 
    foreach (string address in addresses) 
    { 
     address = address.Trim(); 
     try 
     { 
      if (address == "") 
      { 
       return false; 
      } 

      new MailAddress(address); 
     } 
     catch(FormatException) 
     { 
      return false; 
     } 
    } 

    return true; 
} 

Это будет ловить все случаи края, что регулярное выражение не и даже будет лучше с течением времени, как .NET Framework обновляется. Это также упрощает обработку разделителей и пробелов.

0

Попробуйте что-то вроде этого (;|\||,)

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

0

Я пришел с этим:

(\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*(\s?[,|\||;|]\s?)?)+$ 

Я считаю, что это решает мою проблему, любые предложения?

0

Я хотел бы использовать и предпросмотр 'назад для этого:

(?<=\s|\||;|,|^)[\w.+-][email protected](?:[\w-]+\.){1,2}(?:[a-z]{2,6})(?:\.[a-z]{2,6})?(?=\s|\||;|,|$) 

Вы можете проверить это регулярное выражение here.

Смежные вопросы