0

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

输入可能如下所示:

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, '#'); 但这并没有考虑到最后一个中间名首字母。

4

3 回答 3

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'),它返回一个带有first, mi,的对象last。我创建了一个jsbin,您可以尝试测试您在问题中显示的名称格式。

于 2013-04-04T16:56:40.240 回答
4

humanparser在 npm 上结帐。

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' }
于 2014-05-26T06:11:28.077 回答
2

以下似乎符合您的要求

input = input.replace(/\s*,\s*|\s+(?=\S+$)/g, '#');
于 2013-04-04T19:11:37.720 回答