2009-08-24 33 views
1

考虑以下字符串+姓,我想解析成名字+姓氏列表:解析“家庭”的名字进入人们正则表达式

彼得 - 保罗,玛丽&乔尔范德温克尔

(和更简单的版本)

我努力工作,如果我能做到这一点用正则表达式。我走了这么远

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

但这里的问题是,我想在不同的拍摄要捕获的姓氏。

我怀疑我以后什么是可能的,但以防万一...

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

我不得不稍微调整公认的答案得到它覆盖的情况下,如:

彼得 - 保罗&约瑟夫·范德温克尔

彼得 - 保罗&约瑟夫·范德温克尔

+0

我无法从你的问题看这些名字都保证是标准化的,但对于像彼得保罗面包车名der Winkel? (即没有连字符和荷兰语而不是佛兰德/英文大写规则)。 – Ruben 2009-08-24 14:15:31

+0

好问题。我不想在这里太聪明。在这种情况下,如果结果显示firstname = Peter和lastname = Paul van der Winkel,我不介意。目的是要有一个“快速和粗略”的方式来输入联系方式;用户可以随时回退分开输入字段。 – Benjol 2009-08-24 14:18:17

+0

更新与正则表达式为我的答案。 – MaxVT 2009-08-24 14:25:10

回答

1

假设一个第一名称不能是两个词用空格(否则彼得·保罗·范德温克尔是不会自动可分析的),那么下面一组规则适用:

  • (第一名字),则任何数量的(,名字)或(&第一名)
  • 一切都是最后一个名字。

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

看来,这可能做的伎俩:

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