c# - 用于解析姓氏有前缀的名称的正则表达式

标签 c# regex parsing

我正在学习正则表达式 (c#),在 RegexBuddy 中工作(喜欢它)。我一直在尝试用非常具体的模式来解析名称。我知道它无法做到完美,但我认为已经非常接近我想要实现的目标了。

假设:

  1. 名称模式为 FIRST [MIDDLE] LAST,全部大写,其中 MIDDLE 是可选的,并且没有标题或后缀
  2. 我想将 FIRST 和 MIDDLE 捕获到名字值中,将 LAST 捕获到姓氏值中
  3. FIRST 和 MIDDLE 一起可以有任意数量的单词
  4. 我知道我无法匹配多个单词的姓氏(我可以接受),除了以下两种情况:
    • 带连字符的姓氏
    • 姓氏带有前缀的名字(“EL GHAMRY SABE”、“DE AMORIM SILVA”、“DE LA HOYA”是我的数据中的实际示例)

这是到目前为止我的正则表达式(使用一些姓氏前缀):

^(?<first>[ A-Z]+?) (?<last>(?<pfx>(?:(?:EL|DE|LA) )*)[A-Z\-]+?)$

效果很好(捕获名字、姓氏和姓氏前缀):

JOHN SMITH
JOHN JAY SMITH
JOHN JAYEL SMITH
JOHN JAY SMITH-JONES
JOHN JAY JIMMY SMITH JONES  -- only "JONES" is in the last name, which is okay for this exercise
JOHN JAY EL AMIN
JOHN JAY DE LA HOYA  -- "DE LA HOYA" is the last name
JOHN JAY EL  -- a case where "EL" is actually the last name
JOHN EL AMIN

但是对于这两个在姓氏前缀后具有多部分姓氏的人来说失败(在姓氏字段中仅捕获最后一个单词):

JOHN JAY EL GHAMRY SABE
CICERO JOSE TORRES DE AMORIM SILVA

那么...2 个问题:

  1. 如何更改我的表达式,以便如果存在姓氏前缀,则包含前缀及其之后的所有内容(“EL”、“DE”、“LE”、“DE LA”等)都包含在姓氏字段中,如果没有前缀,则姓氏字段中仅包含最后一个单词?
  2. 由于我仍在学习,您能否对我的正则表达式提出其他改进建议?

最佳答案

我会将所有前缀匹配为名字(使用负向前视),然后将行的其余部分匹配为姓氏。

^(?<First>(?:[-A-Z\s](?!\b(?:DE\sLA|EL|DE|LE)\b))+)\s+(?<Last>\b[-A-Z\s]+)$

关于c# - 用于解析姓氏有前缀的名称的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21243333/

相关文章:

c - 将命令行输入放入一个数组中,并将该数组解析为两个新数组

c# - 值中引用类型的可空性与目标类型不匹配

c# - 如何反序列化然后将数据放入表格?

c# - winforms 中的数据转发器控件

c# - 对并发队列的误解,单个消费者在自己的线程上从队列中工作

c++ - 有没有办法在 C++ 正则表达式中重用模式的一部分?

regex - 无法在 PHP 中匹配 preg_match 中的大于号

javascript - 当我的 RegEx 被执行并且与输入不匹配时,浏览器选项卡卡住

c++ - 有效地从字符串中读取括号中的两个逗号分隔的 float ,而不受全局语言环境的影响

Python-创建一个Class-x对象没有属性 'split'