只需添加一些括号
^(([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;