2009-08-24 1 views
1

Учитывая следующую строку, я хотел бы разобрать в список имен + фамилия:Parse «семья» имена в человек + Фамилия с регулярными выражениями

Peter-Paul, Mary & Жоэль Ван-дер-Винкель

(и более простые версии)

Я пытаюсь работать, если я могу сделать это с помощью регулярных выражений. У меня так далеко

(?:([^, &]+))[, &]*(?:([^, &]+)) 

Но проблема в том, что мне хотелось бы, чтобы фамилия была захвачена в другом захвате.

Я подозреваю, что я за то, что это возможно, но только в том случае, ...

UPDATE

Добывающие захватывает из группы было новым для меня, так вот (# C) код, который я использовал :

string familyName = "Peter-Paul, Mary & Joël Van der Winkel"; 
string firstperson = @"^(?<First>[-\w]+)"; //.Net syntax for named capture 
string lastname = @"\s+(?<Last>.*)"; 
string others = @"(?:(?:\s*[,|&]\s*)(?<Others>[-\w]+))*"; 

var reg = new Regex(firstperson + others + lastname); 
var groups = reg.Match(familyName).Groups; 
Console.WriteLine("LastName=" + groups["Last"].Value); 
Console.WriteLine("First person=" + groups["First"].Value); 
foreach(Capture firstname in groups["Others"].Captures) 
    Console.WriteLine("Other person=" + firstname.Value); 

мне пришлось немного подправить принятый ответ, чтобы получить его, чтобы охватить такие случаи, как:

Peter-Paul & Джозеф Ван-дер-Винкель

Peter-Paul & Джозеф Ван-дер-Винкель

+0

Я не могу видеть из вашего вопроса, если эти имена гарантированно нормализуется, но как насчет имени, как Питер Пауль ван дер Винкель? (т. е. не дефис, а голландские, а не фламандские/английские правила капитализации). – Ruben

+0

Хороший вопрос. Я не пытаюсь быть слишком умным здесь. В этом случае, если результат говорит firstname = Peter и lastname = Paul van der Winkel, я не против. Цель состоит в том, чтобы ввести «быстрый и грубый» способ ввода контактной информации; пользователь может всегда отступать от ввода полей отдельно. – Benjol

+0

Обновлено с регулярным выражением для моего ответа. – MaxVT

ответ

1

Предполагая, что первое имя не может быть два слова с пробелом (в противном случае Питер Пол Ван-дер-Винкель не автоматически интерпретируемый), то следующий набор правил применяется:

  • (имя), то любое количество (сначала название) или (& имени)
  • Все остальное - это фамилия.

    ^([-\w]+)(?:(?:\s?[,|&]\s)([-\w]+)\s?)*(.*) 
    
1

Кажется, что это может сделать трюк:

((?:[^, &]+\s*[,&]+\s*)*[^, &]+)\s+([^,&]+)