Javascript Regular Expression尝试将名称拆分为Title / First Name(s)/ Last Name

时间:2010-11-25 12:11:45

标签: javascript regex

我想尝试在Javascript中检测一个人姓名的不同部分,并将其剪切掉,以便我可以将它们传递给其他人。

名称可以以任何格式显示 - 例如: -

miss victoria m j laing

  • Victoria C J Long小姐
  • Bob Smith
  • 佛瑞德
  • 戴维斯先生

我想尝试写一些简单的东西,这样做是最好的猜测这些并且在80%的时间左右正确得到它们(我们有一些非常狡猾的数据)

我正在考虑使用正则表达式检查它是否有前缀,然后分支到两个位置是否有

/^(Dr|Mr|Mrs|Miss|Master|etc).? /

然后用

之类的东西切掉剩下的部分
/(\w+ )+(\w+)/

匹配姓氏和其他名称。虽然,我不确定我在这里的贪婪/不合理的选择,以及我是否可以做一些快捷方式来获得可能有的所有不同路径。基本上,希望找到一些简单的东西,这样可以很好地完成工作。

由于我正在使用的ETL工具的限制,它也必须用Javascript编写。

2 个答案:

答案 0 :(得分:2)

为什么不split(),只检查结果部分:

// Split on each space character
var name = "Miss Victoria C J Long".split(" ");

// Check the first part for a title/prefix
if (/^(?:Dr|Mr|Mrs|Miss|Master|etc)\.?$/.test(name[0])) {
    name.shift();
}

// Now you can access each part of the name as an array

console.log(name);
//-> Victoria,C,J,Long

工作演示:http://jsfiddle.net/AndyE/p9ra4/

当然,这不会解决人们在评论中提到的其他问题,但是你只需要一个正则表达式就可以解决这些问题。

答案 1 :(得分:1)

var title = '';
var first_name = '';
var last_name = '';
var has_title = false;

if (name != null)
{
    var new_name = name.split(" ");

    // Check the first part for a title/prefix
    if (/^(?:Dr|Mr|Mrs|Miss|Master)\.?$/i.test(new_name[0]))
    {
        title = new_name.shift();
        has_title = true;
    }
    if (new_name.length > 1)
    {
        last_name = new_name.pop();
        first_name = new_name.join(" ");
    }
    else if(has_title)
    {
        last_name = new_name.pop();
    }
    else
    {
        first_name = new_name.pop();
    }
}

改编自接受的答案:)