将名称拆分为姓氏,名字,中间名

时间:2013-04-04 16:42:10

标签: javascript regex

我有一个来自文本框的用户输入,其中包含用户名

输入可以如下所示:

var input = "Doe, John M";

但是,输入可能要复杂得多。 像:

var input = "Doe Sr, John M"

"Doe, John M"

"Doe, John, M"

甚至"Doe Sr, John,M"

我想做的是将姓氏(用sr或jr)分隔名字,然后分隔中间名字。

所以,这些字符串变为:

var input = "Doe#John#M""Doe Sr#John#M""Doe#John#M"

我试过这个正则表达式,

input = input.replace(/\s*,\s*/g, '#'); 但这没有考虑到最后的中间初始。

3 个答案:

答案 0 :(得分:4)

我确信这可以通过RegEx完成,但将字符串拆分为数组往往更快,更简单(IMO)。试试这个功能:

var parseName = function(s) {
  var last = s.split(',')[0];
  var first = s.split(',')[1].split(' ')[1];
  var mi = s[s.length-1];

  return {
    first: first,
    mi: mi,
    last: last
  };    
};

你称之为传递名称,例如parseName('Doe, John M')并返回包含firstmilast的对象。我创建了一个jsbin您可以尝试测试您在问题中显示的名称格式。

答案 1 :(得分:4)

在npm结帐humanparser

https://www.npmjs.org/package/humanparser

将人名字符串解析为称呼,名字,中间名,姓氏,后缀。

安装

npm install humanparser

用法

var human = require('humanparser');

var fullName = 'Mr. William R. Jenkins, III'
    , attrs = human.parseName(fullName);

console.log(attrs);

//produces the following output

{ saluation: 'Mr.',
  firstName: 'William',
  suffix: 'III',
  lastName: 'Jenkins',
  middleName: 'R.',
  fullName: 'Mr. William R. Jenkins, III' }

答案 2 :(得分:2)

以下似乎符合您的要求

input = input.replace(/\s*,\s*|\s+(?=\S+$)/g, '#');