Domanda

Data la seguente stringa, vorrei analizzare in una lista di nomi di battesimo + un cognome:

  

Peter-Paul, Mary & Joël Van der Winkel

(e le versioni più semplici)

Sto cercando di capire se posso fare questo con una regex. Ho fin qui

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

Ma il problema qui è che mi piacerebbe il cognome da catturare in una cattura diversa.

Ho il sospetto che sono al di là di ciò che è possibile, ma solo nel caso ...

Aggiorna

cattura estrarre dal gruppo era nuovo per me, quindi ecco il (# C) codice che ho usato:

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

Ho dovuto modificare leggermente la risposta accettata per farlo per coprire casi come:

  

Peter-Paul & Joseph Van der Winkel

     

Peter-Paul & Joseph Van der Winkel

È stato utile?

Soluzione

Supponendo un primo nome non può essere due parole con uno spazio (altrimenti Peter Paul Van der Winkel non è automaticamente analizzabile), allora la seguente serie di regole si applica:

  • (nome), quindi un numero qualsiasi di (, nome) o (e nome)
  • Tutto sinistra è l'ultimo nome.

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

Altri suggerimenti

Sembra che questo potrebbe fare il trucco:

((?:[^, &]+\s*[,&]+\s*)*[^, &]+)\s+([^,&]+)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top