1

给定以下字符串,我想解析为名字 + 姓氏的列表:

彼得-保罗、玛丽和乔尔·范德温克尔

(和更简单的版本)

我正在尝试确定是否可以使用正则表达式来做到这一点。我已经走到这一步了

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

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

我怀疑我超出了可能,但以防万一......

更新

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

我不得不稍微调整接受的答案以使其涵盖以下情况:

彼得保罗和约瑟夫范德温克尔

彼得保罗和约瑟夫范德温克尔

4

2 回答 2

1

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

  • (first name),然后是任意数量的 (, first name) 或 (& first name)
  • 剩下的都是姓氏。

    ^([-\w]+)(?:(?:\s?[,|&]\s)([-\w]+)\s?)*(.*)
    
于 2009-08-24T14:16:10.320 回答
1

似乎这可能会奏效:

((?:[^, &]+\s*[,&]+\s*)*[^, &]+)\s+([^,&]+)
于 2009-08-24T14:26:58.820 回答