2009-08-24 71 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+([^,&]+)