2012-06-06 157 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'-]+)$