解析一个全名'字符串到电子邮件地址

时间:2015-03-02 14:54:25

标签: c# asp.net

我试图修改现有项目。请原谅我缺乏知识,我们的开发人员最近离开了公司,我试图解决问题,直到我们使用新的。

这是一个基于其他信息发送电子邮件的webform应用程序。所有名称都采用以下格式之一:

  
      
  1. 名字姓氏
  2.   
  3. 名字姓氏姓氏2
  4.   
  5. 名字姓氏 - 姓氏2
  6.   

我只是想处理一个字符串来生成一个电子邮件地址。同样,它们遵循设置格式firstname.lastname@domain.com。我想通过找到第一个空间我可以隔离姓氏,只是删除多余的空格或连字符,但我的代码似乎没有用。

我遇到的问题是,如果应用程序收到错误的电子邮件地址,那么拥有多个姓氏的人会导致传递失败。示例:

  

交付失败给这些收件人或团体:Steven.Smith   (Jones@domain.com)

如果它只是史蒂文·琼斯这个名字,它会很好用,我已经多次测试过了。

我的代码:

string fn = FullName.Text.ToString(); 
string y = fn.Substring(0, fn.IndexOf(" ")).Trim().Replace(" ", "");
string z =  fn.Substring(fn.IndexOf(" ") + 1).Trim().Replace(" ", "");
String ToAddress = y + "." + z + "@domain.com";

FullName变量来自我猜的这段代码,它位于page_load类

System.Security.Principal.WindowsIdentity wi = System.Security.Principal.WindowsIdentity.GetCurrent();
        string[] a = Context.User.Identity.Name.Split('\\');

System.DirectoryServices.DirectoryEntry ADEntry = new System.DirectoryServices.DirectoryEntry("WinNT://" + a[0] + "/" + a[1]);
        string Name = ADEntry.Properties["FullName"].Value.ToString();

有没有人对如何实现我的目标有任何想法?我为我大量缺乏知识而道歉,但我并不完全熟悉ASP.NET。根据我的研究,看起来我应该将字符串拆分成一个数组,但我无法理解如何将其实现到我的程序中。

原始代码也没有起作用如下。我试图让它更高效,并且能够在我的例子中处理三个名字。

string myString1 = txtName.Text.ToString();
                int t = myString1.IndexOf(" ", 0);

                //Extract the first name for from address
                int q = t;
                string fn1 = this.txtName.Text.ToString();
                string b = fn1.Substring(0,q);
                //Extract the Last name for from address
                int r= t;
                string ln1 = this.txtName.Text.ToString();
                string c= fn1.Substring(r+1);

谢谢!

5 个答案:

答案 0 :(得分:1)

这样的东西?

        string fn = FullName.Text.ToString();
        string forename = fn.Split(' ')[0];
        string toAddress = forename + "." + fn.Substring(forename.Length + 1) + "@domain.com";

答案 1 :(得分:1)

目前还不完全清楚具有两个姓氏的用户的电子邮件地址应该具有哪种格式,但似乎您应该可以这样做

//Assuming example input "Stephen Smith-Jones" or "Stephen Smith Jones"
//split on spaces and hyphens
string[] names = FullName.Text.ToString()
                     .Split(new string[]{" ", "-"},
                            StringSplitOptions.RemoveEmptyEntries); //in case of extra spaces?

//Stephen.SmithJones@domain.com
var email = String.Format("{0}.{1}{2}@domain.com",
                          names[0],
                          names[1],
                          (names.Length > 2) ? names[2] : "");

它做了什么?将您的全名分成一系列名称。获取名字,第二个名称和(如果有的话)第三个名称并将它们放入电子邮件中。如果你想处理中间名或其他变种,你需要更复杂。

编辑:反映[firstname]。[lastname] [lastname2?] @ domain.com格式

答案 2 :(得分:0)

你不要替换连字符:

替换

string z =  fn.Substring(fn.IndexOf(" ") + 1).Trim().Replace(" ", "");

通过

string z =  fn.Substring(fn.IndexOf(" ") + 1).Trim().Replace(" ", "").Replace("-", "");

此外,您应该检查无效输入和无效的Mail-Adress-Characters。这可能是一个重音字符,例如é......

答案 3 :(得分:0)

您可以使用正则表达式和分组:

Regex r = new Regex("(\\w+) (\\w+)[ -]?(\\w+)?");

string name = "John Anderson Johnson";
Match m = r.Match(name);
if(m.Success)
{
   string first_name = m.Groups[1].Value;
   string last_name = m.Groups[2].Value;
   string last_name2 = ((m.Groups.Count > 2 && !m.Groups[3].Value.Equals(String.Empty))
      ? m.Groups[3].Value : String.Empty);

   // format as desired
   string email = String.Format("{0}.{1}{2}@domain.com", first_name, last_name2);
   string email2 = String.Format("{0}.{1}@domain.com", first_name, last_name);
   Console.WriteLine(email);  // outputs: John.AndersonJohnson@domain.com
   Console.WriteLine(email2); // outputs: John.Anderson@domain.com
}

<强>更新 更新源以处理操作注释:

  

输入的别名格式为:firstname.lastnamelastname@domain.com(无连字符)

答案 4 :(得分:0)

你可以先这样清理你的字符串(我从this线程中取出):

string cleanedString = System.Text.RegularExpressions.Regex.Replace(dirtyString,@"\s+"," ");

然后你可以用点替换空格和连字符:

cleanedString = cleanedString.Trim().Replace(" ", ".").Replace("-", ".");

Johan Doe Doe2将成为John.Doe.Doe2

之后你可以删除最后一部分:

            if (cleanedString.IndexOf('.') != cleanedString.LastIndexOf('.'))
            {
                cleanedString = cleanedString.Substring(0, cleanedString.LastIndexOf('.'));
            }

结果将是John.Doe

你可能会以更好的方式做到这一点......