2012-06-06 195 views
2

我想要拿出正則表達式來分割完整的名稱。正則表達式的分割名稱

第一部分是驗證 - 我想確保名稱與模式「名稱名稱」或「名稱MI名稱」匹配,其中MI可以是一個字符,後面可以跟一個句點。這就排除了諸如「Jose Jacinto De La Pena」這樣複雜的名字 - 這很好。我想到的表達方式是^([a-zA-Z]+\s)([a-zA-Z](\.?)\s){0,1}([a-zA-Z'-]+)$,它似乎能完成這項工作。

但是,如何修改它以將名稱分爲兩部分?如果存在中間首字母,我希望它成爲第一個「名字」的一部分,換句話說,「詹姆斯T.柯克」應該被分成「詹姆斯T.」和「Kirk」。 TIA。

回答

3

只需添加一些括號

^(([a-z]+\s)([a-z](\.?))\s){0,1}([a-z'-]+)$ 

你的比賽將是在第1組現在

string resultString = null; 
try { 
    resultString = Regex.Match(subjectString, @"^(([a-z]+\s)([a-z](\.?))\s){0,1}([a-z'-]+)$", RegexOptions.IgnoreCase).Groups[1].Value; 
} catch (ArgumentException ex) { 
    // Syntax error in the regular expression 
} 

而且,我做出了正則表達式不區分大小寫,這樣就可以把它縮短了(沒有A-ZA -Z但AZ)

更新1

個的號碼組不爲的情況下工作良好,沒有初始所以我寫的正則表達式從扔在一邊

^(\w+\s(\w\.\s)?)(\w+)$ 

\ w表示任何字人格和這也許是你所需要的(你可以取代它AZ如果工作得更好)

更新2

有在C#中一個不錯的功能,你可以命名你捕獲

^(?<First>\w+\s(?:\w\.\s)?)(?<Last>\w+)$ 

現在,你可以通過名字而不是數指基(認爲這是一個有點更具可讀性)

var subjectString = "James T. Kirk"; 
Regex regexObj = new Regex(@"^(?<First>\w+\s(?:\w\.\s)?)(?<Last>\w+)$", RegexOptions.IgnoreCase); 

var groups = regexObj.Match(subjectString).Groups; 
var firstName = groups["First"].Value; 
var lastName = groups["Last"].Value; 
+0

@ChrisH更新我的回答 – buckley

0

您可以通過目前什麼是你的第二個捕獲組非捕獲組中加入?:做到這一點剛剛開幕括號之前,然後再將該整個第二組爲第一組結束,所以這將成爲繼:

^([a-zA-Z]+\s(?:[a-zA-Z](\.?)\s)?)([a-zA-Z'-]+) 

請注意,我還與?取代{0,1},因爲他們是等價的。

這將導致兩個捕獲組,一個用於名字和中間名(如果存在),另一個用於姓。

+0

最後我用這個,非常輕微的修改。捕獲團體是它的地方 - 謝謝! – ChrisH

+0

@ChrisH - 沒問題,因爲您的問題已解決,您應該[接受答案](http://meta.stackexchange.com/a/5235/155356),方法是單擊答案旁邊複選標記的大綱。 –

0

我不確定你是否想要這種方式,但有一種方法沒有正則表達式。

如果名字中的Name Name形式,那麼你可以這樣做:

// fullName is a string that has the full name, in the form of 'Name Name' 
string firstName = fullName.Split(' ')[0]; 
string lastName = fullName.Split(' ')[1]; 

如果名稱是在Name MIName形式,那麼你可以這樣做:

string firstName = fullName.Split('.')[0] + "."; 
string lastName = fullName.Split('.')[1].Trim(); 

希望這有助於!

0

只要把可選部分的第一個捕獲組:

(?i)^([a-z]+(?:\s[a-z]\.?)?)\s([a-z'-]+)$