c# - 使用正则表达式分割名称

标签 c# regex

我正在尝试想出一个正则表达式来分割全名。

第一部分是验证 - 我想确保名称与模式“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/

相关文章:

c# - 如何在 ASP.NET MVC 中获取当前用户

c# - ObservableCollection 不支持 AddRange 方法,因此除了 INotifyCollectionChanging 之外,我会收到添加的每个项目的通知?

c# - 在 C# 应用程序中使用 FastCGI 应用程序

c# - Visual Studio 2015 ASP.NET 身份与 Web 窗体(不是 ASP.NET MVC)

c# - 为什么我的 winforms 组合框显示的是对象的名称而不是我指定的显示成员?

xml - XSLT 2.0 - 正则表达式无限

ruby - 如何匹配不在两个特殊字符之间的正则表达式?

正则表达式和文件名通过删除除最后一个匹配项之外的点并忽略第一个字符来更改

regex - Perl 正则表达式可以用于什么类型的语言?

regex - 我需要一些帮助来缩短这个正则表达式