5

次のいずれかの形式で連絡先を受け取る方法があります。

1-「email@domain.com」

2-「名前<email@domain.com>」または「名前<email@domain.com>」(スペースが存在する場合があります)

(1)形式の場合は何もしません。(2)の場合、名前とメールアドレスを解析する必要があります。

メールを受け取る形式がわかりません。しかし、それは2つのうちの1つになります。

これどうやってするの?

4

7 に答える 7

15

実際には、これを非常に簡単に実行できる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'
于 2012-09-15T22:33:50.290 に答える
1

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>
于 2017-03-14T00:18:18.063 に答える
0

それを行う方法はいくつかありますが、最初に発生したのは

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
}
于 2012-09-15T21:18:16.743 に答える
0

単純な正規表現を設計するか(私の意見では、この場合はエレガントな解決策になります) 、最初の文字列を区切り文字として呼び出しSplit()、 2番目の文字列から終了を削除することができます。'<'Trim()'>'

于 2012-09-15T21:59:09.830 に答える
0

正規表現を使用できます。

        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"]);
        }

ここでは、電子メールの形式を検証する必要がなく、名前に<または>文字が含まれていないことを前提としています

于 2012-09-15T22:02:59.630 に答える
0

正規表現を使用できます。

^((.*?)\s*?<)(.*?)>?$

名前(使用可能な場合)は2番目のキャプチャグループにあり、電子メールは3番目にあります。

例:

var match = Regex.Match("Name <email@domain.com>", @"^((.*?)\s*?<)(.*?)>?$");
string name = math.Groups[2].Value;
string email = match.Groups[3].Value;
于 2012-09-15T22:12:27.960 に答える
0

MimeKitにはそのためのメソッドがあります。

MailboxAddress addr = MailboxAddress.Parse("Mr. Curious <mrcurious@example.com>"); 

.NET、Mono、および .NET Core でも動作します。

于 2020-04-30T14:11:56.987 に答える