Регулярное выражение Javascript для попытки разбить имя на Заголовок / Имя / Фамилию - PullRequest
2 голосов
/ 25 ноября 2010

Я хочу попытаться обнаружить различные части имени человека в Javascript и вырезать их, чтобы я мог передать их чему-то другому.

Имена могут появляться в любом формате, например: -

Мисс Виктория МДж Лейнг

  • Мисс Виктория CJ Лонг
  • Боб Смит
  • Фред
  • Мистер Дэвис

Я хочу попытаться написать что-то простое, и лучше всего будет угадать их и сделать их правильными в 80% случаев или около того (у нас есть некоторые крайне сомнительные данные)

I 'Я думаю о чем-то вроде использования регулярного выражения, чтобы проверить, есть ли у него префикс, затем разветвляется на два пункта о том, имеет ли оно

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

, а затем вырезает остальное, используя что-то вроде

/(\w+ )+(\w+)/

Для соответствия фамилии и других имен.Тем не менее, я не уверен в своих жадных / недобросовестных опциях здесь и в том, могу ли я что-то сделать для быстрого доступа, имея все возможные пути.В основном, в надежде найти что-то простое, хорошо выполняющее эту работу.

Это также должно быть написано на Javascript из-за ограничений используемого мной ETL-инструмента.

Ответы [ 2 ]

3 голосов
/ 25 ноября 2010

Почему бы не 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 голос
/ 25 ноября 2010
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();
    }
}

Адаптировано из принятого ответа:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...