使用正则表达式将“家庭”名称解析为人名+姓氏

时间:2009-08-24 14:10:43

标签: regex text-parsing data-entry

鉴于以下字符串,我想解析名字列表+姓氏:

  

Peter-Paul,Mary& JoëlVander Winkel

(和更简单的版本)

如果我能用正则表达式做到这一点,我正试图解决这个问题。我到目前为止

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

但问题在于我希望在不同的捕获中捕获姓氏。

我怀疑自己超出了可能的范围,但以防万一......

更新

从组中提取捕获对我来说是新的,所以这是我使用的(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);

我不得不稍微调整一下接受的答案,以便涵盖以下案例:

  

Peter-Paul和Joseph Van der Winkel

     彼得保罗&amp; Joseph Van der Winkel

2 个答案:

答案 0 :(得分:1)

假设名字不能是带空格的两个单词(否则Peter Paul Van der Winkel不能自动解析),则适用以下规则:

  • (名字),然后是任意数量的(,名字)或(&amp;名字)
  • 剩下的就是姓氏。

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

答案 1 :(得分:1)

似乎可以解决这个问题:

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