次のいずれかの形式で連絡先を受け取る方法があります。
1-「email@domain.com」
2-「名前<email@domain.com>」または「名前<email@domain.com>」(スペースが存在する場合があります)
(1)形式の場合は何もしません。(2)の場合、名前とメールアドレスを解析する必要があります。
メールを受け取る形式がわかりません。しかし、それは2つのうちの1つになります。
これどうやってするの?
実際には、これを非常に簡単に実行できるMailAddressという.NETクラスがすでに存在します。
更新:表示名だけでなく、メールアドレス、ユーザー名、ホストも取得できます。
最初にインクルードusing System.Net.Mail
してから、次のような情報を取得できます。
MailAddress email = new MailAddress("Johnny <johnny@example.com>");
string displayName = email.DisplayName;
string address = email.Address;
string user = email.User;
string host = email.Host;
これは、あなたがそのように説明した2つのシナリオで機能し"Name <email@domain.com>"
、"Name<email@domain.com>"
両方とも機能し、あなたに与えますName
。私は続けて、ここで見つけることができるテストを作成しました。これにより、次のサンプル出力が得られます。
'email@domain.com' =
DisplayName = ''
Address = 'email@domain.com'
User = 'email'
Host = 'domain.com'
'Name<email@domain.com>' =
DisplayName = 'Name'
Address = 'email@domain.com'
User = 'email'
Host = 'domain.com'
'Name <email@domain.com>' =
DisplayName = 'Name'
Address = 'email@domain.com'
User = 'email'
Host = 'domain.com'
MailAddress
は優れたソリューションですが、残念ながらSystem.Net.Mail
まだ .NET Core に移植されていません。
次の正規表現ソリューションは、適切な形式の入力に対して機能することがわかりました。
var re = new Regex(@"""?((?<name>.*?)""?\s*<)?(?<email>[^>]*)");
var match = re.match(input);
var name = match.Groups["name"].Value;
var email = match.Groups["email"].Value;
次の種類の入力でこれをテストしました。
bob@example.com
<bob@example.com>
Bob Example <bob@example.com>
Bob Example<bob@example.com>
"Bob Example" <bob@example.com>
"Example, Bob J." <bob@example.com>
それを行う方法はいくつかありますが、最初に発生したのは
String[] parts = someValue.Trim().Split(new char[] {' '},false);
if (parts.Length > 1) then
{
// in format "Name OR Name" or more correctly not in format someone@domain.com
}
単純な正規表現を設計するか(私の意見では、この場合はエレガントな解決策になります) 、最初の文字列を区切り文字として呼び出しSplit()
、 2番目の文字列から終了を削除することができます。'<'
Trim()
'>'
正規表現を使用できます。
var str = "Name<email@domain.com>";
var r = new Regex("(?<name>.*?)<(?<email>.*?)>");
if(r.IsMatch(str))
{
var m = r.Match(str);
Console.WriteLine(m.Groups["name"].Trim());
Console.WriteLine(m.Groups["email"]);
}
ここでは、電子メールの形式を検証する必要がなく、名前に<または>文字が含まれていないことを前提としています
正規表現を使用できます。
^((.*?)\s*?<)(.*?)>?$
名前(使用可能な場合)は2番目のキャプチャグループにあり、電子メールは3番目にあります。
例:
var match = Regex.Match("Name <email@domain.com>", @"^((.*?)\s*?<)(.*?)>?$");
string name = math.Groups[2].Value;
string email = match.Groups[3].Value;
MimeKitにはそのためのメソッドがあります。
MailboxAddress addr = MailboxAddress.Parse("Mr. Curious <mrcurious@example.com>");
.NET、Mono、および .NET Core でも動作します。