2009-08-24 4 views
1

Compte tenu de la chaîne suivante, je voudrais analyser dans une liste des prénoms + un nom:noms « famille » Parse dans les + nom de famille avec regex

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

(et les versions plus simples)

Je suis en train de travailler si je peux le faire avec une expression régulière. J'ai jusqu'ici

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

Mais le problème est ici que je voudrais le nom de famille à capturer dans une capture différente.

Je pense que je suis au-delà de ce qui est possible, mais juste au cas où ...

MISE À JOUR

Extraction des captures du groupe était nouveau pour moi, donc voici le code (C#) je :

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

je devais modifier légèrement la réponse acceptée pour l'obtenir pour couvrir des cas tels que:

Peter-Paul & Joseph Van der Winkel

Peter-Paul & Joseph Van der Winkel

+0

Je ne vois pas de votre question si ces noms sont garantis normalisés, mais qu'en est un nom comme Peter Paul van der Winkel? (c'est-à-dire, pas de tiret, et des règles de capitalisation néerlandaises plutôt que flamandes/anglaises.) – Ruben

+0

Bonne question. Je n'essaie pas d'être trop intelligent ici. Dans ce cas, si le résultat indique prénom = Peter et last = Paul van der Winkel, cela ne me dérange pas. L'objectif est d'avoir un moyen «rapide et brut» d'entrer les coordonnées; l'utilisateur peut toujours se rabattre sur la saisie des champs séparément. – Benjol

+0

Mise à jour avec l'expression rationnelle pour ma réponse. – MaxVT

Répondre

1

En supposant un premier nom ne peut pas être deux mots avec un espace (sinon Peter Paul Van der Winkel est pas automatiquement analysable), l'ensemble de règles suivant applique:

  • (prénom), puis un nombre quelconque de (, prénom) ou (& prénom)
  • Tout ce qui reste est le nom de famille.

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

Il semble que cela pourrait faire l'affaire:

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