解析称呼& amp;全名字段中的名字

时间:2015-11-25 07:57:30

标签: javascript regex

我有一个包含全名的字符串。

全名的格式可能有也可能没有称呼。在称呼之后也可能有也可能没有一段时间(可以显示为先生或先生)。例如,我可以收到:

  • "太太。艾拉安德森"
  • " Ella Anderson"
  • " Jennifer Sply小姐"
  • "先生。丹·约翰逊"
  • " Damien Hearst"

我的目标是从全名字符串中删除称呼。一旦称呼被删除,我想从全名中解析出名字。我是正则表达式的新手,但我确实理解如何解析名字。我不知道怎么办的一部分就是摆脱称呼。

var string = "Ella Anderson"
var first = string.replace(/\s.*$/, "").toUpperCase().trim();

5 个答案:

答案 0 :(得分:2)

这个正则表达式应该可行。



var regex = /(Mr|MR|Ms|Miss|Mrs|Dr|Sir)(\.?)\s/,
    fullNames = ["Mrs. Ella Anderson", "Ella Anderson", "Miss Jennifer Sply", "Mr. Dan Johnson", "Damien Hearst"];

var names = fullNames.map(function(name) {
  var match = regex.exec(name),
      n = "";
  (match !== null) ? n = name.replace(match[0], "") : n = name;
  return n;
});

console.log(names);




答案 1 :(得分:1)

问题是全名首先是字符串。如果可能的话,您应该将其更改为仅使用单独的字段。

没有人知道用户将在文本框中输入什么内容。也不可能可靠地确定剩余名称的哪一部分是名字,以及姓氏的哪一部分。

如果输入数据被正确分开,您将不再需要弄清楚什么是什么。

因此,如果可能,请将输入名称的方式更改为:



<select name="select">
  <option>Miss</option> 
  <option>Mrs</option>
  <option>Mr</option>
  <option>etc...</option>
</select>
<input placeholder="First name" />
<input placeholder="Surname" />
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您可以使用此正则表达式:/((Mrs|Mr|Miss)\.? )?([^ ]*) ?([^ ]*)/

示例:

var regex = /((Mrs|Mr|Miss)\.? )?([^ ]*) ?([^ ]*)/;
regex.exec('Mrs. Ella Anderson') == ["Mrs. Ella Anderson", "Mrs. ", "Mrs", "Ella", "Anderson"];
regex.exec("Ella Anderson") == ["Ella Anderson", undefined, undefined, "Ella", "Anderson"];
regex.exec("Miss Jennifer Sply") == ["Miss Jennifer Sply", "Miss ", "Miss", "Jennifer", "Sply"];
regex.exec("Mr. Dan Johnson") == ["Mr. Dan Johnson", "Mr. ", "Mr", "Dan", "Johnson"];
regex.exec("Damien Hearst") == ["Damien Hearst", undefined, undefined, "Damien", "Hearst"];
regex.exec("Missy Jennifer") == ["Missy Jennifer", undefined, undefined, "Missy", "Jennifer"];

如果你想要名字和姓氏,你只需要查看数组的最后两个值。

当然,这个正则表达式不会像`Mr.约翰史密斯少年。如果你想要通用的东西,不要使用正则表达式。

答案 3 :(得分:0)

这是一个相当复杂的正则表达式:

/^(?:(Miss|M[rs]{1,2})\.?\s+)?(\S+)\s+(\S+)$/

然后,如果你想要中间名或缩写,它会变得像jr一样棘手。或者sr。 - 这几乎都是可行的。关于如何处理连字符有一些问题。

答案 4 :(得分:0)

您可以使用以下正则表达式:^[ \t]*(?<title>(Shri|Leu|DR|mrs|SMT|Major|Gen){1,10}(\.|,))?\s*(?<LstName>[A-Z][a-z-']{2,20}),? +(?<FstName>[A-Z,a-z]+)*[ \t]*[^\n]*

在以下测试数据上进行了测试: Major. Amator Gary L Mrs. Grundy Ronald Dr. Domsky Alan Shri. Worden Scott Allen Rodriguez Howard W NEHME ALLEN RODRIGUEZ CHARLES G VERGARA WILLIAM F J EVELYN J Leu. GLICK, JACOB L. SMT. Taylor-garcia Dottielou