Analizzare i nomi di famiglia '' in persone + cognome con espressioni regolari
-
19-09-2019 - |
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
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+([^,&]+)