Разобрать фамилии в людей + фамилию с помощью регулярных выражений - PullRequest
1 голос
/ 24 августа 2009

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

Питер-Поль, Мэри и Жоэль Ван дер Винкель

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

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

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

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

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

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);

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

Петр-Поль и Иосиф Ван дер Винкель

Петр-Поль и Иосиф Ван-дер-Винкель

Ответы [ 2 ]

1 голос
/ 24 августа 2009

Кажется, что это может сработать:

((?:[^, &]+\s*[,&]+\s*)*[^, &]+)\s+([^,&]+)
1 голос
/ 24 августа 2009

Если имя не может состоять из двух слов с пробелом (в противном случае Peter Paul van der Winkel не может автоматически разбираться), тогда применяется следующий набор правил:

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

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