我正在尝试想出一个正则表达式来分割全名。
第一部分是验证 - 我想确保名称与模式“Name Name”或“Name MI Name”匹配,其中 MI 可以是一个字符(可选后跟一个句点)。这会淘汰像“Jose Jacinto De La Pena”这样的复杂名称 - 这很好。我想出的表达式是 ^([a-zA-Z]+\s)([a-zA-Z](\.?)\s){0,1}([a-zA- Z'-]+)$
似乎可以完成这项工作。
但是我如何修改它以将名称仅分成两部分?如果存在中间首字母,我希望它成为第一个“名称”的一部分,换句话说,“James T. Kirk”应该拆分为“James T”。和“柯克”。 TIA。
最佳答案
只需添加一些括号
^(([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,而是 a-z)
更新1
数字组对于没有首字母的情况效果不佳,所以我从头开始编写正则表达式
^(\w+\s(\w\.\s)?)(\w+)$
\w 代表任何单词字符,这可能就是您所需要的(如果效果更好,您可以将其替换为 a-z)
更新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;
关于c# - 使用正则表达式分割名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10923557/