Ruby-从电子邮件地址中查找文本中的名字和姓氏

Ruby-从电子邮件地址中查找文本中的名字和姓氏,ruby,regex,Ruby,Regex,这是一个有趣的问题,我一直在玩,但找不到答案 我有一个非结构化数据的文本文件,包括电子邮件和全名。我已经提取了电子邮件,但我想把名字和姓氏映射到每封电子邮件 因此,假设电子邮件是ksmith@gmail.com,页面上的某个地方是“凯文·史密斯” 我想使用“@”前面的任何内容来映射文本中某个地方的全名。但显然,搜索“ksmith”不会返回匹配项。然后,从左边开始,我会搜索一个较少的字符,即“史密斯”,这将匹配 但是当我找到“史密斯”时,我也想找到他的名字。因此,可能假设这始终是姓氏(因为大多数电

这是一个有趣的问题,我一直在玩,但找不到答案

我有一个非结构化数据的文本文件,包括电子邮件和全名。我已经提取了电子邮件,但我想把名字和姓氏映射到每封电子邮件

因此,假设电子邮件是ksmith@gmail.com,页面上的某个地方是“凯文·史密斯”

我想使用“@”前面的任何内容来映射文本中某个地方的全名。但显然,搜索“ksmith”不会返回匹配项。然后,从左边开始,我会搜索一个较少的字符,即“史密斯”,这将匹配

但是当我找到“史密斯”时,我也想找到他的名字。因此,可能假设这始终是姓氏(因为大多数电子邮件都有姓氏,但没有名字),从“Smith”开始向左搜索,直到找到下一个空格(在“Kevin”前面),并计算出在“Smith”和“Kevin”之前的空格之间的是名字

但是,如果全名是“凯文·迈克尔·史密斯”或“凯文·p·史密斯”呢?在这种情况下,我不想要“迈克尔”或“P.”,而是想要凯文作为我的名字

或者,如果电子邮件结构是smithk@gmail.com,在这种情况下,从左侧收缩子字符串永远不会匹配,我也需要从另一侧尝试

基本上,我需要一个足够聪明的方法,在许多情况下识别这些全名

任何帮助都将不胜感激


我正在用Ruby做这件事,如果这有帮助的话,当你找到姓氏时,你会移回第一个名字,因此,在到达下一个空格之前,你应该看看下一个名字的第一个字母后面是否有空格,例如,你的“Kevin p.Smith”算法会找到“p”但如果您检查“P”后面是否有空格,然后查找名称的下一部分。所以对于“Kevin Micheal John Smith”,你会得到Kevin,因为首先你到达“John”,然后你会看到“J”后面有空格,所以你会移回“Micheal”,再次有空格绑定“M”,所以你移到“Kevin”。因为凯文后面没有空格,所以你有名字

例如,最简单的解决方案是使用Split函数

string_=string_.split(" ");
firstName=string_[0];

我的建议是编写一个算法,生成一个全名数组。例如:

a = ["kevin smit", "andrew john", "thom devid", "M. K. Add","k smith"]
b= "ksmith@gmail.com"
c = b.split('@')[0]
=> "ksmith" 
first = c[0]
=> "k"
last = c[1..c.length]
=> "smith" 

a.each do |i|
  if i.gsub(" ").count == 1
    if (i.split(" ")[0][0] == first && i.split(" ")[1] == last) ||   (i.split(" ")[0][0] == last && i.split(" ")[1] == first)
       p i
    end
  elsif i.gsub(" ").count == 2
    if (i.split(" ")[0][0] == first && i.split(" ")[2] == last) ||   (i.split(" ")[0][0] == last && i.split(" ")[2] == first)
       p i.split(" ")[0] +  i.split(" ")[2]
    end
  end
end

这对你有用。如果有多个场景,你可以使用switch case而不是if else

“M.Kevin Smith”是另一个需要考虑的变体——使用中间名的人,或“J.p.Smith”或“尊敬的J.Michael Smith III”。我们不能忘记“雪儿”。我猜这类问题是经常遇到的。所以你基本上想让我们修复模糊指定的启发式失败的情况,并为你编写代码?谢谢,也许改天吧。写下实际的代码,然后再问一遍。不要指望有人会为我写这段代码,我只是想了解如何最好地处理这段代码。从Cary的评论中,我看到我没有考虑所有相关的问题,我想获得关于如何解决这样的问题的反馈,以及是否有可能可靠地使用代码。对不起,如果这个问题冒犯了你…那么-你尝试了什么?